【问题标题】:Cloud Datastore transaction terminated without explicit rollback definedCloud Datastore 事务在未定义显式回滚的情况下终止
【发布时间】:2020-07-16 01:53:09
【问题描述】:
【问题讨论】:
标签:
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 在代码中添加自己的重试逻辑。
总之,如果一个事务被中断并且你的逻辑没有相应地处理失败,你最终可能会看到你的数据库中的数据不一致。