有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数据存储:删除事务外部的实体

我找不到完全解释从数据存储中删除实体的文档(我使用的是JDO deletePersistent),而不在事务中。为了性能和避免争用而不使用事务时,我可以承受在并行更新期间丢失数据准确性的代价

但是,当我的代码同时在不同的机器上运行时,如何确保删除操作不会被另一台机器上对该实体的前一次读取所覆盖,我让PersistenceManager处理对附加对象的隐式更新

编辑: 尝试在deletePersistent之后更新该实体将导致异常,但这是在尝试更新传递给deletePersistent的完全相同副本时发生的。但是,如果它是另一台机器上的另一个副本,则会被视为更新已删除的实体(无效),或者被视为插入或更新,从而将该实体放回原处


共 (2) 个答案

  1. # 1 楼答案

    答案是肯定的,即使在对象被删除后,如果之前读取过它,并且在提交删除后提交更新,它也会被放回去,因为@Nick Johnson评论说插入和更新是相同的。测试表明,在获取要更新的对象后,使用20秒的线程睡眠,可以删除该对象,然后将其放回原处

  2. # 2 楼答案

    这来自GAE文档:

    Using Transactions

    A transaction is a set of Datastore operations on one or more entity. Each transaction is guaranteed to be atomic, which means that transactions are never partially applied. Either all of the operations in the transaction are applied, or none of them are applied.

    An operation may fail when:

    Too many users try to modify an entity group simultaneously. The application reaches a resource limit. The Datastore encounters an internal error.

    因为事务保证是原子的,所以像单个删除操作这样的原子操作总是在事务内部或外部工作