【发布时间】:2018-03-05 00:48:40
【问题描述】:
GAE 文档警告:
尽可能使您的数据存储事务具有幂等性,这样如果您重复事务,最终结果将是相同的。
假设我想在两个人之间转移一笔钱:
class User(ndb.Model):
balance = ndb.IntegerProperty(default=0)
@ndb.transactional(xg=True)
def transfer(from_key, to_key, amount)
from = from_key.get()
to = to_key.get()
from.balance -= amount
to.balance += amount
ndb.put_multi([from, to])
由于这不是幂等的,它可能会发生不止一次并导致问题。我想重构它以确保事务是幂等的。
answer 提出了一个解决方案:
要解决此问题,您可以通过创建“交易密钥”并将该密钥作为交易的一部分记录在新实体中来使交易具有幂等性。第二个事务可以检查该事务密钥,如果找到,则什么也不做。一旦您对交易完成感到满意,或者您放弃重试,就可以删除交易密钥。
但我不明白如何实现它。
有人能解释一下如何使这个事务具有幂等性吗?
【问题讨论】:
-
阅读这篇旧文章。虽然它是在 appengine 中存在许多新功能之前编写的,但仍然值得将其作为实现您正在尝试做的事情的指南。 blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine
标签: google-app-engine transactions google-cloud-datastore