是否失败 - 与“事务冲突” - 对实体的写操作会覆盖对另一个成功提交的事务对同一实体所做的更改吗?
我了解gae中的交易操作位于snapshot SERIALIZABLE isolation,但不清楚write skew是否可行。
为简单起见,这是做计数器的一个坏例子:
def increment_counter(key, amount):
obj = db.get(key)
obj.counter += amount
obj.put()
如果在事务中运行,因碰撞而失败并重新尝试,它会正确更新吗?
重试意味着整个操作是重新尝试还是只是提交,或者它是否意味着冲突在实体组上,但这里所做的更改与实体组中的其他更改不冲突 - 导致它们在哪里制作给不同的实体。
PS。这可能是一个愚蠢的问题,但它让我觉得这些重试是如何应用的。
更新
在Transactions文章中,我错过了一条线索。
如果在交易期间更新了实体,则会重试交易,直到所有步骤都完成而不中断
这是否意味着在碰撞后重新运行在事务上下文中运行的整个代码?
答案 0 :(得分:1)
是的,在发生碰撞时重新运行整个功能。这就是您必须在自己的函数中实现事务的原因:因为它们可能需要多次执行。保证您的交易变更不会覆盖其他交易变更 - 这是交易性的全部要点。