【发布时间】:2026-02-04 10:15:01
【问题描述】:
objectify documentation 声明了关于交易的这一点:
工作必须是幂等的。各种条件,包括 ConcurrentModificationException,可能导致事务重试。如果 您需要限制可以尝试交易的次数,使用 transactNew(int, Work)。
但是,谷歌数据存储区documentation 指出:
Datastore API不会自动重试事务,但您 可以添加您自己的逻辑来重试它们,例如处理冲突 当另一个请求同时更新同一个实体时。
这些陈述似乎相互矛盾。对象化交易真的重试了吗?为了安全起见,我使用transactNew(1, Work) 来确保它只运行一次,但幕后发生了什么以及为什么?
Google 文档指出,交易的一种用途是执行诸如将资金从一个帐户转移到另一个帐户之类的事情。如果交易正在重试,那么这将不起作用,因为本质上转移资金不是幂等的。在这种情况下,使用transactNew(1, Work) 是正确的做法吗?基本上,我希望安全地进行非幂等事务。
【问题讨论】:
-
这可能取决于使用的数据存储客户端库。例如python
ndb库会自动重试因冲突而失败的事务。
标签: google-app-engine google-cloud-datastore objectify