这里是把 <1,Jack>,<2,Candy> 两个属于不同region、不同tikv的key按事务写入tikv。
- 首先是prewrite,在default cf 和 lock cf 写入数据,把要写入的变更按region分成2个grpc,分别发送给2个tikv。
- 两个tikv 分别在default cf中写入数据,lock cf 中写入锁。其中 tikv1 中的是主锁,tikv2的是从锁
- 提交时,tikv_client 首先给主锁所在的region发送grpc,在write cf中写入commit记录put<1_100,100>,删除lock cf 中的锁<1,(D,pk,1,100…)>,这两个cf的数据利用rocksdb支持的多cf的原子写入保证同时成功或失败。
- 主锁提交成功后才给tikv2发送grpc,tikv2 在write cf中写入commit记录 put<2_110,100>,删除lock cf中的锁<2,(D,@1, 2,100…)>。 同样也是原子写入。
这里第四步,tikv2 的 grpc 是肯定能成功的,如果这时候 tikv2 的 region 不可访问了,等 3 副本选出新的 leader 以后再写 write cf 和 lock cf,如果3副本中2副本坏了,那后续恢复后,其他事务看到2 candy 上有没提交的事务,去检查主锁 1 jack已经提交了,就直接把 2 candy 提交了。也就意味着不可能出现提交失败的情况。都持久化了。
这里应该是碰到了 bug
