死锁是指两个或多个事物在同一资源上相互占用,并请求锁定对方占用的资源,从而大致恶性循环的现象。当多个事物试图以不同的顺序锁定资源时,就可能发生死锁。多个事物同时锁定统一资源时,也会产生死锁。例如:
事物1:
1 2 3 4 |
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:
1 2 3 4 |
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语句,却发现该行已经被对方锁定,然后两个事物同时等待对方放锁,同时又持有对方所需要的锁,则陷入了死循环。除非有外部因素介入才可能解除死锁。
死锁发生以后,只有部分或完全回滚其中一个事物,才能打破死锁。对于事物型的系统,这是无法避免的,所以应用程序在设时必须考虑如何处理死锁。大多数情况下需要重新执行因死锁回滚的事物即可。
本文作者: GavinDong
版权属于: GavinDong博客
文章链接: https://gavindong.com/2751.html
如果使用过程中遇到问题,可 **点击此处** 交流沟通。
版权所有,转载时必须以链接形式注明作者和原始出处及本声明。