【问题标题】:Recovering from Datastore commit exceptions for transactions that are not idempotent从非幂等事务的数据存储提交异常中恢复
【发布时间】:2026-02-10 09:10:01
【问题描述】:

https://developers.google.com/appengine/docs/java/datastore/transactions 的 Google App Engine 文档是这样说的:

注意:在极少数情况下,事务完全提交,即使 如果事务返回超时或内部错误异常。为了 因此,最好让事务在任何时候都具有幂等性 可能。

如果事务不是幂等的,从提交异常中恢复的正确方法是什么?

【问题讨论】:

    标签: google-cloud-datastore


    【解决方案1】:

    我认为您所做的就是向最终用户显示一个错误,其中包含一个他们可以用来查看其世界状态的链接。然后最终用户可以决定是否重新提交。例如。如果他们在博客上发表评论并且帖子以某种方式报告错误,他们可以重新加载博客页面并查看他们的评论是否存在;如果他们发现不是,他们可以(希望)从浏览器历史记录中恢复并重新提交。

    【讨论】:

    • 如果记录的操作很重要,比如付款怎么办?
    • 嗯,对于用户来说,这与他们点击“发送”付款然后他们的互联网连接突然中断的情况并没有太大区别。当它恢复时,他们必须重新登录并检查付款是否发生。你应该设计你的 webapp 来支持那个用例——同样的方法也将帮助用户从这些“极端罕见的情况”中恢复过来。 (FWIW,我从未听说过实际发生这种情况的 App Engine 用户。)
    • 也许对于如此重要​​的事务,您可以在失败时以编程方式手动验证数据的状态,而不是给用户施加压力:例如捕获错误并验证数据是否已写入一个问题。可行性取决于您的交易中发生的过程的复杂性。不过,支付之类的东西很容易检测到,如果您手动分配实体标识符,则更容易检测到。这个问题基本上是:“我如何检测是否需要忽略假数据存储故障”