【问题标题】:Is a re-tried transation after transaction collision safe?事务冲突后修复的事务是否安全?
【发布时间】: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


    【解决方案1】:

    是的,如果发生碰撞,整个函数会重新运行。这就是你必须在它们自己的函数中实现事务的原因:因为它们可能需要执行多次。保证您的事务更改不会覆盖其他事务更改 - 这就是事务性的全部意义所在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2012-08-14
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多