- 需要先明白乐观和悲观的区别,理解 TiDB 两阶段提交,题主的问题我理解只可能发生在乐观事务情况,对于悲观事务在 prewrite 阶段就会检查 ts 进入悲观锁等待
- 上面很多人提到了,commit 时会需要向 PD 获取一次 tso,此时 prewrite 已经过了,其他事务不应该能抢先 prewrite 而会进入 backoff retry。 反之如果其他事务先于当前事务 prewrite 成功,则当前事务 prewrite 应该 backoff retry
具体可以看一些官网介绍比如 TiDB 最佳实践系列(三)乐观锁事务 | PingCAP
另外 5.0 针对一些特殊 case 做了 1PC 优化 Async Commit 原理介绍丨 TiDB 5.0 新特性 | PingCAP
官网文档对乐观写写冲突的说明: https://docs.pingcap.com/zh/tidb/stable/troubleshoot-lock-conflicts#keyislocked-错误