关于percolator的secondary 异步提交问题

这篇文章的最后说道: 由于锁是分两级的,primary 和 seconary,只要 primary 的行锁去掉,就表示该事务已经成功 提交,这样的好处是 secondary 的 commit 是可以异步进行的,只是在异步提交进行的过程中 ,如果此时有读请求,可能会需要做一下锁的清理工作。 问题: primary 成功,但是secondary 失败了,为什么不会丢数据? primary 成功了,给client 端返回成功了,secondary 还没提交,这时client 在收到事务成功后发送查secondary 更新的key的value,这时会怎么处理呢?

不会丢失数据,因为在 2pc commit 阶段,primary 是提交成功才算成功的 ,seconary 是异步提交, 在 prewrite 阶段 lock cf 里面的 value 是会包含 primary 的信息。如果 commit 阶段有异常, seconary 没有把 lock cf 里面的信息提交,则在 下次读取请求的时候会根据 value 去查询 primary 的状态,如果 primary 的状态是提交成功的话,则会在读取的时候或者 gc 的时候做 Resolve Lock 。 具体可以看下 雪莲 老师的博客。里面有更详细的解析。 https://andremouche.github.io/tidb/transaction_in_tidb.html