悲观事务&&RC 隔离级别下,快照读 select 请求,可能会调用 TIKV 哪些接口?

通过 debug TIDB 和 TIKV 的代码发现:

  • select * from managers where first_name=‘brad8’; 语句未能命中索引,因此没有使用 tidb 的 pointget 而是 coprocessor。因此调用的 tikv 接口不是 batchget 而是 coprocessor

  • TIDB 即使对于 RC 级别的快照读,也会对 TIKV 使用 SI 隔离级别的 get/coprocessor 请求。对此, TIKV 的代码特意针对 SI 级别的快照读进行特殊判断,不检测悲观锁的锁冲突,用于防止 select 快照读请求被其他悲观事务阻塞 (例如有其他事务在执行 select for update/update/delete):

  • 即使 RC 级别的事务,TIKV 也是会去 LOCK CF 获取锁信息的,虽然读出来悲观锁后,会跳过,这样做应该是为了保障悲观锁乐观锁同时存在的场景,防止 RC 级别的事务读取不到乐观锁新提交的事务。如果 RC 级别的快照读遇到乐观锁,那么也会返回锁冲突然后进行等锁、重试。