Cockroachdb 仲裁丢失后重试SQL插入时出现重复键值
我目前正在使用3个cockroachDB节点测试失败场景 使用此场景: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
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文档