字数
573 字
阅读时间
3 分钟
1. 活锁
- 定义:系统可能使某个事物永远处于等待状态,得不到封锁的机会
- 解决办法/如何避免/预防
- 先来先服务
- "升级":当一个事务等待若干时间后仍未轮到封锁机会,则提高其优先级
2. 饿死
- 定义:可能存在一个事务序列,每个事务都申请对某一数据加 S 锁,且每个事务都会在授权加锁后一小段时间内释放封锁,此时若有另一个事务T2希望在该数据上加 X 锁,则将永远轮不上封锁的机会,这种现象称为"饿死"
- 解决办法/如何避免/预防
- 当事务T2申请对数据 Q 加 S 锁时,授权加锁的条件是
- 不存在数据项 Q 上持有 X 锁的其他事务
- 不存在等待对数据项 Q 加锁且先于 T2 申请加锁的事务
- 当事务T2申请对数据 Q 加 S 锁时,授权加锁的条件是
3. 死锁
- 定义:系统中有两个或两个以上的事务都处于等待状态,并且每个事务都在等待另一个事务解除封锁,它才能继续执行,结果造成任何一个事务都无法继续执行,这就称系统进入了"死锁"
- 解决办法/如何避免/预防
- 一次封锁法:每个事务必须一次性将所有要使用的数据进行加锁,否则不允许进行操作
- 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务按这个顺序实施封锁
- 如何判断:
- 超时法:如果一个事务的等待时间超过了规定时限,则认为发生了死锁
- 等待图法:构建事务等待图(有向图),若存在回路,即为死锁
- 如何解除死锁:
- 选择一个处理死锁代价最小的事务,将其撤销(UNDO),释放此事务持有的所有锁
贡献者
freeway348