Mysql如何进行死锁检测
mysql的InndoDB存储引擎使用wair-for graph(等待图)的方式来进行死锁检测。
wair-for graph要求数据库保存一下两种信息:
- 锁的信息链表
- 事务等待锁链表
之后根据上述链表可构造出一张图,若这个图中存在回路就代表存在死锁。
示例如下:
- 在TWL(Transaction Wait Lists)中可以看到,一共有四个事务,所以在图中有四个节点。而事务t2 对row1占 x锁(排它锁),事务t1 对row2占s锁(共享锁)。
- 事务t1 需要等待t2 中的row1资源,因此在wair-for graph图中有条边从t1指向t2.
- 事务t2 需要等待t1 ,t4 所占用的row2 对象,故存在节点t2 到t1,t4的边
- 同样存在t3 到 t1,t2,t4的边
- 最终可以发现回路(t1,t2)
目前wair-for graph使用深度优先搜索的算法实现。
根据上述信息可构造如下图: