死锁是怎么回事?怎么造成的死锁?我来给大家讲讲原理

死锁是怎么回事?怎么造成的死锁?我来给大家讲讲原理

死锁是指两个或多个事物在同一资源上相互占用,并请求锁定对方占用的资源,从而大致恶性循环的现象。当多个事物试图以不同的顺序锁定资源时,就可能发生死锁。多个事物同时锁定统一资源时,也会产生死锁。例如:

事物1:

start transactioon;
update a set close = 45 where id = 4 and date = '2018-10-10';
update a set close = 40 where id = 3 and date = '2018-10-11';
commit;

事物2:

start transactioon;
update a set aa = 45 where id = 3 and date = '2018-10-10';
update a set aa = 40 where id = 4 and date = '2018-10-11';
commit;

如果凑巧,两个事物都执行了第一条UPDATE语句,更新了第一行数据,同时也锁定了该行数据,接着每个事物尝试去执行第二条UPDATE语句,却发现该行已经被对方锁定,然后两个事物同时等待对方放锁,同时又持有对方所需要的锁,则陷入了死循环。除非有外部因素介入才可能解除死锁。

u=3045870818,1376216020&fm=200&gp=0.jpg

为了解决这一问题,数据库系统实现了各种弄死锁检测和死锁超时机制。越复杂的系统,比如InnoDB存储引擎,越能检测到死锁和循环依赖,并立即返回一个错误。这种解决方式很有效,负责死锁会导致出现非常慢的查询。还有一种解决方式,就是当查询的时候达到锁等待的设定后放弃锁请求,这种方式通常来说不太好。InnoDB目前处理死锁的方式是:将持有最少行级排他锁的事物进行回滚(这是相对比较简单的死锁回滚算法)。

锁的行为和顺序和存储引擎相关。以同样的顺序执行的语句,有些存储引擎会产生思索哦,有些则不会。死锁的产生有双重原因:有些是因为真正的数据冲突,这种情况通常很那避免,但有些完全是由存储引擎的实现方式导致的。

死锁发生以后,只有部分或完全回滚其中一个事物,才能打破死锁。对于事物型的系统,这是无法避免的,所以应用程序在设时必须考虑如何处理死锁。大多数情况下需要重新执行因死锁回滚的事物即可。

死锁怎么造成的你看明白了吗?

死锁是怎么回事?怎么造成的死锁?我来给大家讲讲原理

喜欢(2)

评论 抢沙发

表情