有时,在Cockroachdb中成功执行查询需要延迟

有时,在Cockroachdb中成功执行查询需要延迟,cockroachdb,Cockroachdb,我正在尝试将我们的PostgreSQL数据库迁移到Cockroach DB。所以,在我的本地电脑(MacBookPro)上安装了单节点服务器之后,我正在运行moch测试。有些问题我一个接一个地解决了,但最后一个问题。问题是测试(已通过)开始失败,并显示以下错误消息: Error: current transaction is aborted, commands ignored until end of transaction block . 这是我的运行节点配置(在不安全模式下运行): Coc

我正在尝试将我们的PostgreSQL数据库迁移到Cockroach DB。所以,在我的本地电脑(MacBookPro)上安装了单节点服务器之后,我正在运行moch测试。有些问题我一个接一个地解决了,但最后一个问题。问题是测试(已通过)开始失败,并显示以下错误消息:

Error: current transaction is aborted, commands ignored until end of transaction block
.
这是我的运行节点配置(在不安全模式下运行):

CockroachDB节点从2019-01-27 13:11:46.17270052+0000 UTC开始(耗时0.9秒)
构建:CCL v2.1.1@2018/11/19 18:20:16(go1.10.3)
webui:http://localhost:8080
sql:postgresql://root@本地主机:26257?sslmode=禁用
客户端标志:cockroach--host=localhost:26257--不安全
我尝试在插入记录后以1秒的延迟运行sql查询,它开始工作


如果有人能解释为什么可能需要这种延迟以及任何解决方案,我将不胜感激。

您看到的错误是由于试图在事务的上下文中发出另一个命令已被中止

但是如果没有看到事务内部发生了什么导致它中止,我就无法说出事务中止的原因

您可以分享您正在使用的DML、DDL和模式吗

谢谢


罗恩

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

.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
    }
  })
})
但我做错了,比如:

// *** THIS IS THE WRONG CODE.
.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
  if (e.code == 40001) {
    return batch(list)
  } else {
    return client.query('rollback').then(() => {
      throw e
    })
  }
})
因此,导致中止事务的连接在放回连接池之前没有回滚,并且在下次使用时导致了错误

考虑到为什么1秒延迟有助于克服这种情况,我猜想连接池管理器会在空闲一秒钟后终止连接

// *** THIS IS THE WRONG CODE.
.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
  if (e.code == 40001) {
    return batch(list)
  } else {
    return client.query('rollback').then(() => {
      throw e
    })
  }
})