如何重试已中止的Spanner提交?

时间:2019-05-13 19:34:58

标签: google-cloud-platform google-cloud-spanner

Commit()的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上重现已中止的提交以验证我的重试逻辑正确?

2 个答案:

答案 0 :(得分:3)

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

  • 如果交易中止,则应重试整个交易。

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

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

答案 1 :(得分:1)

中止的事务包括提交冲突。这意味着您在事务处理期间读取的数据可能不再有效,因此您的代码所做的所有决定以及尝试写入的数据都可能基于无效数据...因此您必须重新执行事务处理时的所有操作开始。

要对此进行具体说明,请考虑以下代码:读取一个计数器,将其加倍,然后写回该计数器。想象一下,您的代码读取4尝试写入8,但获得了ABORT。重新启动事务后,该值现在可能为5,因此尝试再次写入该8是错误的。取而代之的是,您的代码必须从头开始以计算它需要编写10。如果您的代码有副作用,这将变得很棘手。