Cloud Datastore 事务在未定义明确回滚的情况下终止

Cloud Datastore transaction terminated without explicit rollback defined

来自以下文档:https://cloud.google.com/datastore/docs/concepts/transactions

  1. 如果事务失败但没有明确回滚定义会怎样?例如,如果我们对值参数执行 put() 操作。

  2. 文档说事务应该是幂等的,这对put()操作意味着什么?目前尚不清楚在这种情况下如何应用幂等性。

  3. 如果根据文档,提交失败不可靠,我们如何检测失败?

  4. 我们看到一些症状,其中 put() 反对值参数有时会部分保存数据。请注意,我们没有明确定义回滚。

您可能已经知道,Datastore 事务保证 atomic,这意味着它应用 全有或全无原则;要么所有操作都成功,要么全部失败。这可确保您数据库中的数据随时间保持一致。

现在,无论您是否在事务中执行 put 或任何其他操作,代码的实现都应始终确保您的事务已成功提交或回滚。这意味着如果您不能完全确定 commit 是否成功,您应该明确发出 rollback.

但是,在某些情况下,提交 可能会失败,这并不一定意味着没有数据写入您的数据库。 documentation 甚至指出 “在事务已提交的情况下,您可能会收到错误消息。”

检测事务失败的简单方法是在您的代码中添加一个 try/catch 块,用于 Exception(失败的事务操作)或 DatastoreException(与数据存储相关的错误 - 提交失败)被抛出。我相信您可能已经在 中找到了关于这个特定问题的答案。

一个好的做法是尽可能进行交易 idempotent。换句话说,如果您正在执行一个包含对数据库的写入操作 put() 的事务,如果此操作失败并需要重试,那么最终结果应该理想保持不变。

一个现实世界的例子可以是——你想把一些钱转给你的朋友;该交易包括从您的银行账户中提取 20 美元并将相同金额存入您朋友的银行账户。如果交易失败并必须重试,交易仍应以与最终结果相同的金额(20 美元)进行操作。

请记住,数据存储区 API 默认情况下不会重试事务,但您可以根据 documentation.

将自己的重试逻辑添加到您的代码中

总而言之,如果事务中断并且您的逻辑没有相应地处理失败,您最终可能会看到数据库数据不一致。