YugabyteDB YSQL出现Already present: Duplicate request错误是否可重试?
关于YugabyteDB
Already present: Duplicate request, XX000 错误的重试说明 错误触发原因
Already present: Duplicate request, XX000 是YugabyteDB的YSQL层内置的请求去重机制抛出的报错,触发核心原因是同一个请求被重复提交到了YugabyteDB节点,且前一次提交的同ID请求还在服务端处理队列中,高并发场景下如果客户端重试策略过于激进、或者网络存在抖动导致请求重复发送时,很容易触发该报错。
是否可安全重试
该错误是否可以安全重试,完全取决于你提交的请求本身是否幂等:
- 若为幂等请求(例如只读查询、携带唯一主键的
INSERT ON CONFLICT DO NOTHING操作、写入固定值的更新操作等,多次执行不会改变最终结果),可以直接安全重试,不会引发数据异常。 - 若为非幂等请求(例如无唯一约束的插入操作、累加类更新
UPDATE table SET num = num + 1、无去重校验的业务写入等),绝对不能直接重试,否则会出现数据重复写入、数值累加异常等不符合预期的问题。
优化建议
高并发场景下频繁触发该报错时,优先排查根因再做处理:
- 检查客户端超时阈值是否设置过短,很多时候是请求还在服务端正常处理,客户端就判定超时触发了重试,这种场景适当调高超时时间即可大幅降低报错概率
- 如果确实存在网络抖动等不可避免的重复请求场景,建议先给所有写入操作加上业务层幂等校验逻辑,再配置重试策略,从根源避免重试带来的数据问题
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

