问题很简单。
Google数据存储区交易是否采用乐观并发控制?
文档的一部分说确实如此:
交易开始时,App Engine通过检查交易中使用的实体组的最后更新时间来使用开放式并发控制。提交实体组的交易后,App Engine会再次检查交易中使用的实体组的最后更新时间。如果自我们的初始检查以来已更改,则将引发异常。 Source
该文档的另一部分表明没有:
启动事务后,数据存储将拒绝任何其他在事务完成之前写入该实体组的尝试。为了说明这一点,假设您有一个由两个实体组成的实体组,一个在层次结构的根部,另一个直接在层次结构的下方。如果这些实体属于单独的实体组,则可以并行更新它们。但是,由于它们是同一实体组的一部分,因此任何尝试更新实体之一的请求都将必然阻止同时请求更新同一组中的任何其他实体,直到原始请求完成为止。 Source
据我了解,第一个引号告诉我,如果我没有理由更新该实体,则可以开始事务,读取实体并忽略关闭事务。
第二个引号告诉我,如果我启动一个事务并读取一个实体,那么我应该始终记得再次关闭它,否则我将无法在同一实体上启动新的事务。
文档的哪一部分是正确的?
顺便说一句。如果正确的报价是第二个报价,则我使用Objectify处理所有交易。即使没有进行任何更改,这还会记住关闭所有已开始的事务吗?
最佳答案
评论者(Greg)是正确的。无论您是否明确关闭事务,所有事务都会在请求结束时由容器关闭。您无法“泄漏”交易(尽管您可以在单个请求中破坏交易)。
此外,使用Objectify的交易API,当您执行Work
单位时,交易会自动为您打开和关闭。您自己不管理交易。
要回答您的根本问题:是的,GAE数据存储区中的所有交易都是乐观的。数据存储区中没有悲观锁定;您可以在单个实体组上启动任意数量的事务,但只有第一次提交才能成功。所有随后的提交尝试将使用ConcurrentModificationException
回滚。