【问题标题】:Cloud Datastore transaction terminated without explicit rollback definedCloud Datastore 事务在未定义显式回滚的情况下终止
【发布时间】:2020-07-16 01:53:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: google-cloud-datastore


    【解决方案1】:

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

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

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

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

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

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

    请记住,默认情况下 Datastore API 不会重试事务,但您可以根据 documentation 在代码中添加自己的重试逻辑。

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

    【讨论】:

      猜你喜欢
      • 2016-03-10
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      相关资源
      最近更新 更多