【发布时间】:2014-09-02 14:18:12
【问题描述】:
我正在编写一个 Google App Engine Golang 应用程序。在Datastore Transaction documentation中,有一条说明:
注意:如果您的应用在提交交易时收到错误消息,并不总是意味着交易失败。在事务已提交并最终将成功应用的情况下,您可以收到 ErrConcurrentTransaction。尽可能使您的 Datastore 事务具有幂等性,这样如果您重复事务,最终结果将是相同的。
这让我相信,如果一个事务返回 ErrConcurrentTransaction,这意味着 Datastore 最终将完成该事务。但是,阅读RunInTransaction 我们可以看到一条注释:
如果 f 返回 nil,则 RunInTransaction 尝试提交事务,如果成功则返回 nil。如果由于事务冲突而导致提交失败,则 RunInTransaction 将重试 f,每次都使用新的事务上下文。它在 3 次尝试失败后放弃并返回 ErrConcurrentTransaction。
看起来 ErrConcurrentTransaction 是 RunInTransaction 函数的失败状态,这意味着事务永远不会提交。
那么,它是什么?如果 RunInTransaction 返回 ErrConcurrentTransaction,我的代码应该假设什么?交易成功了,以后会成功,还是失败了?
【问题讨论】:
标签: google-app-engine error-handling transactions go consistency