tidb query语句会触发resolveLock操作吗

当在事务中读数据或者 prewrite keys 时,如果 key 上已经有 Lock 了,这时就需要进行 ResolveLock 。为什么会出现这种情况?有以下几种情况:

  1. 事务 txn_1 在完成 prewrite key_1,key_2 后就异常退出了,那么此时事务 txn_2 再去读 key_1, key_2 时,就会发现有 txn_1 在 prewrite 时写的 Lock。
  2. 事务 txn_1 在 prewrite key_1完成,但在 key_2 因为冲突而失败时,txn_1 会终止并异步清理 key_1 上的锁,如果异步清理锁还没完成,此时 txn_2 去读 key_1 ,也会遇到 Lock
  3. 事务 txn_1 在 commit primary key 成功后,是用异步 commit second keys,在异步 commit 还没完成时,txn_2 去读 second keys 时也会遇到 Lock。

那么如何 ResolveLocks 呢?prewrite keys 时会同时带上一个 LockTTLResolveLock的流程首先是检查所有 Lock 的 TTL,记下最久的 expire Time ,并发现如果有 keys 上的 locks 的 ttl 已经过期后,就会发起对这些过期 keys 的 Locks 进行 resolveLock,如果还有 keys 的 locks 没有 resolve,就根据最久的 expire time 进行 back off 后重试。