我想将我们的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查询,然后它开始工作。
我希望如果有人可以解释为什么可能需要这种延迟,和任何溶液。
答案 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秒钟的延迟有助于克服这种情况的原因,我猜想该连接在空闲一秒钟后被连接池管理器杀死。