问题相当简单。
Google Datastore事务是否乐观的并发控制?
文件中有一部分说它是这样做的:
当事务启动时,App通过检查事务中使用的实体组的最后更新时间来使用乐观并发控制。在为实体组执行事务时,again再次检查事务中使用的实体组的上一次更新时间。如果它在我们的初始检查后发生了更改,则会引发异常。来源
文档的另一部分表明它没有:
当事务启动时,数据存储拒绝在事务完成之前向该实体组写入的任何其他尝试。为了说明这一点,假设您有一个实体组,由两个实体组成,一个位于层次结构的根部,另一个则直接在其下面。如果这些实体属于单独的实体组,则可以并行更新。但是,由于它们是同一个实体组的一部分,任何试图更新其中一个实体的请求都必然会阻止同步请求更新同一组中的任何其他实体,直到原始请求完成为止。来源
据我理解,第一个引号告诉我,如果我没有看到更新实体的理由,那么启动事务、读取实体和忽略关闭事务是可以的。
第二个引号告诉我,如果我启动了一个事务并读取了一个实体,那么我应该永远记住再次关闭它,否则我就不能在同一个实体上启动一个新的。
文档的哪一部分是正确的?
顺便说一下。如果正确的报价是第二个报价,我将使用物化处理所有事务。这是否会记得关闭所有已启动的事务,即使没有进行任何更改?
发布于 2015-08-08 15:25:52
评论(格雷格)是正确的。无论是否显式关闭事务,所有事务都由容器在请求结束时关闭。您不能“泄漏”事务(尽管您可以在单个请求中破坏事务)。
此外,使用Objectify的事务API,当您执行Work的一个单元时,事务会自动打开和关闭。你不是自己管理交易的。
要回答您的根本问题:是的,GAE数据存储中的所有事务都是乐观的。数据存储中没有悲观的锁定;您可以在单个实体组上启动任意数量的事务,但只有第一次提交才能成功。所有后续提交尝试都将使用ConcurrentModificationException回滚。
https://stackoverflow.com/questions/31891335
复制相似问题