扳手模拟器-挂起事务



我们在沙箱环境中使用扳手模拟器。有时会发生一些事务挂起,这导致了以下错误:

Caused by: com.google.api.gax.rpc.AbortedException: io.grpc.StatusRuntimeException: ABORTED: Transaction 37431 aborted due to active transaction 27078. The emulator only supports one transaction at a time.

我们发现,在出现这样的问题后,让扳手模拟器再次工作的唯一方法是重新创建一个数据库(删除并创建(,这很烦人。

我已尝试终止gcloud spanner databases sessions list --database=db --instance=sand列出的所有会话,但无济于事。

有什么方法可以在扳手模拟器中中止/回滚挂起的事务吗?

应该执行事务27078的回滚RPC。话虽如此,但这并不一定简单:

  1. 您正在使用哪个客户端库/驱动程序?从您发布的错误消息来看,它似乎是Java。在这种情况下,您可以尝试构造一个RollbackRequest,并手动调用生成的客户端中的Rollback方法
  2. 这种情况是如何/何时发生的?通常,Java客户端应该自动回滚任何失败的事务。或者您正在使用常规Java客户端之外的其他驱动程序

我在使用Python客户端时也遇到了这个问题。在深入研究代码后,我发现如果在事务中引发异常,则客户端不会关闭该事务。根据我的观察,云Spanner可以很好地自行正确关闭这些挂起的事务,但Spanner Emulator根本无法做到这一点。

最新更新