MySQL死锁

本文介绍了死锁的概念,通过实例解释了死锁产生的原因,指出死锁至少需要两个进程争夺两个以上的资源。在MySQL中,死锁的场景通过会话示例进行了展示,MySQL能检测并解决死锁,通过特定命令可以查看死锁详情和事务加锁状态。解决死锁的方法包括调整资源获取顺序和强制结束事务。
摘要由CSDN通过智能技术生成

1,死锁的概念

是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。

举个例子:A和B去按摩洗脚,都想在洗脚的时候,同时顺便做个头部按摩,13技师擅长足底按摩,14擅长头部按摩。

这个时候A先抢到14,B先抢到13,两个人都想同时洗脚和头部按摩,于是就互不相让,扬言我死也不让你,这样的话,A抢到14,想要13,B抢到13,想要14,在这个想同时洗脚和头部按摩的事情上A和B就产生了死锁。怎么解决这个问题呢?

第一种,假如这个时候,来了个15,刚好也是擅长头部按摩的,A又没有两个脑袋,自然就归了B,于是B就美滋滋的洗脚和做头部按摩,剩下A在旁边气鼓鼓的,这个时候死锁这种情况就被打破了,不存在了。

第二种,C出场了,用武力强迫A和B,必须先做洗脚,再头部按摩,这种情况下,A和B谁先抢到13,谁就可以进行下去,另外一个没抢到的,就等着,这种情况下,也不会产生死锁。

所以总结一下:

死锁是必然发生在多操作者(M>=2个)情况下,争夺多个资源(N>=2个,且N<=M)才会发生这种情况。很明显,单线程自然不会有死锁,只有B一个去,不要2个,打十个都没问题;单资源呢?只有13,A和B也只会产生激烈竞争,打得不可开交,谁抢到就是谁的,但不会产生死锁。同时,死锁还有几个要求,1、争夺资源的顺序不对,如果争夺资源的顺序是一样的,也不会产生死锁;

2、争夺者拿到资源不放手。

2,MySQL中的死锁

MySQL中的死锁的成因是一样的。

会话1:

begin;
select * from
teacher where number = 1 for update;

会话2:

begin;
select * from
teacher where number = 3 for update;

会话1

select * from teacher where number = 3 for
update;

可以看到这个语句的执行将会被阻塞

会话2 :

select * from
teacher where number = 1 for update;

MySQL检测到了死锁,并结束了会话2中事务的执行,此时,切回会话1,发现原本阻塞的SQL语句执行完成了。

同时通过

show engine  innodb status\G

可以看见死锁的详细情况:

查看事务加锁的情况,不过一般情况下,看不到哪个事务对哪些记录加了那些锁,需要修改系统变量innodb_status_output_locks(MySQL5.6.16引入),缺省是OFF。

show
variables like 'innodb_status_output_locks';

我们需要设置为ON,

set global
innodb_status_output_locks = ON;

然后开启事务,并执行语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值