Cockroachdb 仲裁丢失后重试SQL插入时出现重复键值

Cockroachdb 仲裁丢失后重试SQL插入时出现重复键值,cockroachdb,Cockroachdb,我目前正在使用3个cockroachDB节点测试失败场景 使用此场景: 在循环中插入记录 关闭3个节点中的2个(以模拟仲裁丢失) 等待足够长的时间,以便Postgres JDBC驱动程序引发IO异常 重新启动一个节点以恢复仲裁 重试上一个失败的语句 然后我遇到了以下异常 Cause: org.postgresql.util.PSQLException: ERROR: duplicate key value (messageid)=('71100358-aeae-41ac-a397-b797880

我目前正在使用3个cockroachDB节点测试失败场景

使用此场景:

  • 在循环中插入记录
  • 关闭3个节点中的2个(以模拟仲裁丢失)
  • 等待足够长的时间,以便Postgres JDBC驱动程序引发IO异常
  • 重新启动一个节点以恢复仲裁
  • 重试上一个失败的语句
  • 然后我遇到了以下异常

    Cause: org.postgresql.util.PSQLException: ERROR: duplicate key value (messageid)=('71100358-aeae-41ac-a397-b79788097f74') violates unique constraint "primary"
    
    这意味着当仲裁再次可用时,插入在第一次尝试(我从中获得IO异常)时成功。问题是我没有意识到这一点

    我不能假设应用程序逻辑问题会导致“重复键值”异常。我是否可以调整任何参数,使基础语句在IO异常之前回滚?或者是更好的方法

    测试是使用

    • CockroachDB v1.1.5(3个节点)
    • MyBatis 3.4.0
    • PostgreSQL驱动程序42.2.1
    • 爪哇8

      • 这里可能会发生一些事情

        首先,如果您要杀死的节点之一是网关节点(您的 Java进程正在连接到),可能只是数据正在 已提交,但节点在能够发回确认之前已死亡 给客户。在这种情况下,蟑螂能做的事情不多 或任何其他数据库

        更微妙的情况是,您要杀死的节点是除此之外的节点 网关节点。也就是说,与您交谈的节点将一个 错误,尽管数据已成功提交。这里的问题是 数据一写入raft就被提交,但有可能 如果其他节点已经死亡(并且可能稍后再恢复),则无法恢复 网关节点,以了解它们是否已提交其请求的数据 让他们去。在这种情况下,CockroachDB返回一个“不明确的结果错误”。 我不确定jdbc是如何公开返回给服务器的错误的细节的 客户机在这种情况下,但如果您检查错误本身,它应该说 类似的东西

        在its中简要讨论了CockroachDB中不明确的结果,有关可返回的错误类型的信息,请参阅CockroachDB文档