首页 理论教育数据库技术与应用教程-死锁问题与预防

数据库技术与应用教程-死锁问题与预防

【摘要】:图7—11死锁情景死锁问题在操作系统和一般并行处理中已经有了深入的阐述,这里不做过多解释。预防死锁的方法有多种,常用的方法有一次封锁法和顺序封锁法。这种方法的问题是封锁范围过大,降低了系统的并发性。

如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,由于T2已经封锁了R2,因此T1等待T2释放R2上的锁。然后T2又请求封锁R1,由于T1已经封锁了R1,因此T2也只能等待T1释放R1上的锁。这样就会出现T1等待T2先释放R2上的锁,而T2又等待T1先释放R1上的锁的局面,此时T1和T2都在等待对方先释放锁,因而形成死锁,如图7-11所示。

图7—11 死锁情景(www.chuimin.cn)

死锁问题在操作系统和一般并行处理中已经有了深入的阐述,这里不做过多解释。目前,在数据库中解决死锁问题的方法主要有两类:一类是采取一定的措施来预防死锁的发生,另一类是允许死锁的发生,但采用一定的手段定期诊断系统中有无死锁,若有则解除之。

预防死锁的方法有多种,常用的方法有一次封锁法和顺序封锁法。一次封锁法是每个事务一次将所有要使用的数据全部加锁。这种方法的问题是封锁范围过大,降低了系统的并发性。而且,由于数据库中的数据不断变化,使原来可以不加锁的数据,在执行过程中可能变成了被封锁对象,进一步扩大了封锁范围,从而更进一步降低了并发性。顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序封锁。这种方法的问题是若封锁对象较多,则随着插入、删除等操作的不断变化,使维护这些资源的封锁顺序很困难,另外事务的封锁请求可随事务的执行而动态变化,因此很难事先确定每个事务的封锁事务及其封锁顺序。