数据库下的阻塞和死锁的理解
本文主要介绍阻塞和死锁这两个概念,以此来区别这两个概念。
目录
1.阻塞
定义: 多个事务的并发访问数据行时,因为不同锁的兼容性问题才导致了阻塞。比如说A事务的排他锁占据了某些数据行,而在同时事务B的锁(S/X锁)想要去占用这些数据行,但是事务A的排他锁没有释放,所以事务B必须等待事务A释放排他锁,我们称“事务B等待这个事件”为阻塞。
2.死锁
2.1 什么是死锁
定义:两个或者两个以上的事务在执行过程中,因为争夺资源而造成的一种相互等待的现象。如果没有外力推动,事务将无法推动下去。我们称这些永远在等待中的线程称为死锁线程。
2.2死锁产生的原因
2.2.1事务之间对资源的访问的交替
事务A 访问了表a,并且锁住了表a,然后去访问表b,同理,事务B访问了表b,并且锁住了表b,然后去访问表a;由于现在表a和表b都是锁住的,而且事务A如果要访问表b,必须满足事务B释放对表b的锁,事务B如果要访问表a,必须满足事务A释放对表a的锁定,所以事务A和事务B都进入“阻塞”状态,而且无法再次进入正常状态,我们称之为死锁。
2.3 如何解决死锁
2.3.1事务之间对资源的访问的交替解决方案
这种情况是程序Bug产生的,需要调整程序的逻辑结构。在对多表进行操作的时候,尽量按照相同的顺序进行处理,避免同时锁定两个资源,如操作两个表的时候,先a后b,必须同时锁定两个资源的时候,要保证在任何时候都应该按照相同的顺序来锁定资源。
参考:
【1】https://blog.****.net/qq_16681169/article/details/74784193