我们在沙箱环境中使用扳手模拟器。有时,某些事务会挂起,导致以下错误:
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 执行 Rollback RPC 应该可以做到这一点。话虽这么说,但这并不一定简单:
RollbackRequest
并在生成的客户端中手动调用 Rollback 方法。我在使用 Python Client 时也遇到了这个问题。在深入研究代码后,我发现如果事务中引发异常,则客户端不会关闭该事务。根据我的观察,云 Spanner 可以很好地自行正确关闭这些挂起的事务,但 Spanner 模拟器根本无法做到这一点。