【发布时间】:2011-10-14 12:13:12
【问题描述】:
一个失败的——带有“事务冲突”——对一个实体的写操作能否覆盖对另一个成功提交的事务对同一实体所做的更改?
我知道 gae 中的事务操作在 snapshot SERIALIZABLE isolation 中,但不清楚 write skew 是否可能。
为了简单起见,一个做计数器的坏例子:
def increment_counter(key, amount):
obj = db.get(key)
obj.counter += amount
obj.put()
如果在事务中运行,由于冲突而失败并重试,它会正确更新吗?
重试是否意味着整个操作被重新尝试或只是提交,或者它是否意味着冲突发生在实体组上,但这里所做的更改与实体组中的其他更改不冲突 - 因为它们在对不同的实体进行。
PS。这可能是一个愚蠢的问题,但它让我很困惑这些重试究竟是如何应用的。
更新
Transactions 文章中有一条我错过的线索。
如果在事务期间更新了实体,则重试事务,直到所有步骤都完成而不中断
这是否意味着在事务上下文中运行的整个代码在发生冲突后会重新运行?
【问题讨论】:
标签: google-app-engine transactions google-cloud-datastore