TiDB 在遇到死锁时的行为。 TiKV 如有锁等待逻辑就会造成死锁。 TiDB 目前采用了全局死锁检测的方式,如果发现当前的等锁行为会形成死锁,就会立刻返回给 TiDB 告知死锁异常,通过这种方式直接把死锁拒绝在源头。
为了保证死锁检测服务的高可用,我们将该服务放在了特定 region leader 所在的 TiKV 实例上,当需要等待锁时,如果发现不是事务加的个锁就需要检测死锁,死锁检测请求中会携带如下信息:
- 代表当前事务 ID(start_ts)
- 等待事务的 ID(start_ts)
- 等待的 Key 的信息(目前用 key 的 hash 表示)
目前死锁检测算法为:
- 维护全局的 wait-for-graph,该图保证无环。
- 每个请求会尝试在图中加一条 txn -> wait_for_txn 的 edge,若新加的导致有环则发生了死锁。
- 因为需要发 RPC,所以死锁时失败的事务无法确定。