Mysql-InnoDB存储引擎中-死锁

今天我们来看死锁,死锁的一般场景大家都能想到,只要你不是很菜,A获取资源Z之后再获取资源X,B获取资源X之后再获取资源Z,这样就造成了死锁。

解释:

死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。

解决办法:

1.超时。

InnoDB中设置了超时时间,参数为innodb_lock_wait_timeout。

2.wait-for graph(等待图)

由于超时机制虽然简单,但是仅仅通过超时后对事务进行回滚,或者根据FIFO的顺序来选择回滚对象。如果此时回滚的事务占权过大,反而不合时宜。因此采用等待图来检测死锁,这是一种更为主动的死锁检测方式。InnoDB也采用的这种方式。

wait-for graph中保存了两种数据:

2.1 锁的信息链表

2.2 事务等待链表

通过链表可以构造出一张图,如果图中存在回路,代表出现死锁。

图的指向定义为:T1指向T2表名,T1等待事务T2所占用的资源或者事务T1最终等待T2所占用的资源。


T2对row1占用X锁,事务T1对row2占用S锁,事务T1需要等待事务T2中row1的资源,事务T2需要等待T1,T4占用的row2的资源。在形成的回路中T1和T2之间存在回路,因此造成了死锁。

样例:


死锁类似问题后续补充....

猜你喜欢

转载自blog.csdn.net/qq_32924343/article/details/80492757