首页 > 解决方案 > 如何重试已中止的 Spanner 提交?

问题描述

在 Spanner 文档中Commit(),它说:

提交可能会返回一个 ABORTED 错误。这可能随时发生;通常,原因是与并发事务冲突。但是,它也可能由于各种其他原因而发生。如果 Commit 返回 ABORTED,调用者应该从头开始重新尝试事务,重新使用相同的会话。

https://cloud.google.com/spanner/docs/reference/rpc/google.spanner.v1#google.spanner.v1.Spanner.Commit

两个问题:

  1. 如果事务被中止,我是否必须重新运行从事务开始执行的所有语句才能重试?或者只是重试commit()一次就足够了?

  2. 如何在 Spanner 上重现中止的提交以验证我的重试逻辑是否正确?

标签: google-cloud-platformgoogle-cloud-spanner

解决方案


我建议使用官方 Cloud Spanner 客户端库。它们有各种事务运行器抽象,可以对错误做出适当的反应,包括重试逻辑。

  • 如果事务中止,则应重试整个事务。

  • Cloud Spanner 没有提供强制中止事务的直接方法。您可以设置两个事务来执行以下操作:

    1. 开始交易 T1
    2. 开始交易 T2
    3. T1 读取第 1 行
    4. T2 读取第 1 行
    5. T1 提交(写入第 1 行)将成功
    6. T2 提交(写入第 1 行)将中止

推荐阅读