TIDB死锁检测

2020-06-12 00:00:00 事务 等待 就会 死锁 检测

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,所以死锁时失败的事务无法确定。

相关文章