什么是死锁?请给出预防死锁的若干方法。
问题描述
什么是死锁?请给出预防死锁的若干方法。希望能解答下
- 精选答案
-
如果事务T 1 封锁了数据R 1 T 2 封锁了数据R 2 然后T 1 又请求封锁R 2 因T 2 已封锁了R 2 于是T 1 等待T 2 释放R 2 上的锁。
接着T 2 又申请封锁R 1 因T 1 已封锁了R 12 T 2 也只能等待T 1 释放R 1 上的锁。这样就出现了T 1 在等待T 2 而T 2 又在等待T 1 的局面T 1 和T 2 两个事务永远不能结束形成死锁如图。 在数据库中产生死锁的原因是两个或多个事务都已封锁了一些数据对象然后又都请求已被其他事务封锁的数据加锁从而出现死等待。 防止死锁的发生其实就是要破坏产生死锁的条件。预防死锁通常有两种方法: (1)一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁否则就不能继续执行; (2)顺序封锁法预先对数据对象规定一个封锁顺序所有事务都按这个顺序实行封锁。 如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R12,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁,如图。 在数据库中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求已被其他事务封锁的数据加锁,从而出现死等待。防止死锁的发生其实就是要破坏产生死锁的条件。预防死锁通常有两种方法:(1)一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行;(2)顺序封锁法,预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。