2011-10-14 62 views
1

失败 - “事务冲突” - 对实体的写操作是否会覆盖对另一个成功提交的事务上的相同实体所做的更改?交易后碰撞是否安全?

我知道gae中的交易操作在snapshot SERIALIZABLE isolation中,但不清楚write skew是否可能。

为了简单起见,做柜台的坏榜样:

def increment_counter(key, amount): 
    obj = db.get(key) 
    obj.counter += amount 
    obj.put() 

如果在事务中运行,失败,因为碰撞和重新尝试,将它正确地更新?

重试意味着整个操作被重新尝试还是仅仅是提交,还是这意味着碰撞发生在实体组上,但这里所做的更改与实体组中的其他更改没有冲突 - 因为它们在哪里制造不同的实体。

PS。这可能是一个愚蠢的问题,但它让我误解了这些重试是如何应用的。

UPDATE

Transactions文章是我错过了一个线索。

如果实体在交易期间更新,则交易将重试,直到没有中断完成所有步骤

这是否意味着,在事务上下文整个代码运行之后重新运行碰撞?

回答

1

是的,整个功能在发生碰撞时重新运行。这就是你必须在自己的函数中实现事务的原因:因为它们可能需要多次执行。确保您的交易变更不会覆盖其他交易变更 - 这就是交易性的要点。