有时,存在Cockroachdb执行的成功查询所需要的延迟

时间:2019-01-29 15:33:55

标签: cockroachdb

我想将我们的PostgreSQL数据库蟑螂DB。因此,在本地(Macbook Pro)上设置单节点服务器后,我将运行Moch测试。有一些问题我一一解决,但最后一个。问题是测试(已通过)开始失败,并显示以下错误消息:

Error: current transaction is aborted, commands ignored until end of transaction block
.

这是我正在运行的节点配置(以不安全模式运行):

CockroachDB node starting at 2019-01-27 13:11:46.17270052 +0000 UTC (took 0.9s)
build:               CCL v2.1.1 @ 2018/11/19 18:20:16 (go1.10.3)
webui:               http://localhost:8080
sql:                 postgresql://root@localhost:26257?sslmode=disable
client flags:        cockroach <client cmd> --host=localhost:26257 --insecure

在插入记录后,我试图以1秒钟的延迟运行sql查询,然后它开始工作。

我希望如果有人可以解释为什么可能需要这种延迟,和任何溶液。

2 个答案:

答案 0 :(得分:0)

您看到的错误是在事务已中止的情况下尝试发出另一个命令的结果。

但是,如果看不到事务内部发生了什么导致它中止的情况,我将无法知道事务为什么中止。

您可以共享使用的DML,DDL和模式吗?

谢谢

罗恩

答案 1 :(得分:0)

感谢罗恩。问题出在我尝试处理错误代码40001(可重试错误)的代码中。处理这种情况的正确方法是在重试之前回滚事务,而我没有这样做。正确的代码应如下所示:

Telbook tomb[50];
tomb[0].num = 0;

但是我做错了,就像:

.catch( (e) => {
  // check whether the error is "retryable error" (40001) or not. if yes,
  // retry the whole batch, if not rollback and then re-throw the exception
  return client.query('rollback').then(() => {
    if (e.code === '40001') {
      return batch(list)
    } else {
      throw e
    }
  })
})

因此导致中止的事务的连接在放回连接池之前没有回滚,这导致下次使用该错误。

考虑到1秒钟的延迟有助于克服这种情况的原因,我猜想该连接在空闲一秒钟后被连接池管理器杀死。