第四节 活锁和死锁
封锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题。如何避免活锁,采用先来先
服务的策略:当多个事务请求封锁同一数据对象时;按请求封锁的先后次序对这些事务排队;该数据对象上
的锁一旦释放,首先批准申请队列中第一个事务获得锁。
死锁:
解决死锁的方法,两类方法:
1. 预防死锁
产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据
对象加锁,从而出现死等待。预防死锁的发生就是要破坏产生死锁的条件。预防死锁的方法:一次封锁法;
顺序封锁法。
2. 死锁的诊断与解除
(1)一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。一次
封锁法存在的问题:降低并发度,扩大封锁范围,将以后要用到的全部数据加锁,势必扩大了封锁的范围,
从而降低了系统的并发度。难于事先精确确定封锁对象。数据库中数据是不断变化的,原来不要求封锁的数
据,在执行过程中可能会变成封锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象。解决方法:
将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发度。
(2)顺序封锁法,难于实现。事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一
个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。
例:规定数据对象的封锁顺序为A,B,C,D,E。事务T3起初要求封锁数据对象B,C,E,但当它封锁了B,C后,
才发现还需要封锁A,这样就破坏了封锁顺序。
结论:在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点,DBMS在解决死锁的问题上更
普遍采用的是诊断并解除死锁的方法。
允许死锁发生,解除死锁,由DBMS的并发控制子系统定期检测系统中是否存在死锁。一旦检测到死锁,
就要设法解除。超时法,如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
优点:实现简单。缺点:有可能误判死锁,时限若设置得太长,死锁发生后不能及时发现。等待图法:
用事务等待图动态反映所有事务的等待情况,事务等待图是一个有向图G=(T,U),T为结点的集合,每个结
点表示正运行的事务。U为边的集合,每条边表示事务等待的情况。若T1等待T2,则T1,T2之间划一条有向
边,从T1指向T2,并发控制子系统周期性地(比如每隔1 min)检测事务等待图,如果发现图中存在回路,
则表示系统中出现了死锁。
解除死锁,选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务能
继续运行下去。
|