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之间存在回路,因此造成了死锁。

样例:


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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值