活锁:
简单描述:
事务T1封锁了数据R
事务T2又请求封锁R,于是T2等待。
T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。
T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……
T2有可能永远等待,这就是活锁的情形
解决方法:
采用先来先服务的策略
死锁:
简单描述:
事务T1封锁了数据R1
T2封锁了数据R2
T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁
接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁
这样T1在等待T2,而T2又在等待T1,T1和T2两个事务永远不能结束,形成死锁
死锁的预防:
- 一次封锁法
每个事务必须一次将所有要使用的数据全部加锁
存在问题:
1.降低系统并发度
2.难于事先精确确定封锁对象
- 顺序封锁法
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
存在问题:
1.维护成本:数据库系统中封锁的数据对象极多,并且在不断地变化。
2.难以实现:很难事先确定每一个事务要封锁哪些对象
- 死锁的诊断与解除
1.超时法 2.事务等待法(如果事务等待图存在回路,则表示系统中出现了死锁)
死锁的诊断与解除
解除死锁:处理死锁代价最小的事务,将其撤销释放,将其它事务继续运行
可串行化调度
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同
DBMS对并发事务不同的调度可能会产生不同的结果
例:现在有两个事务,分别包含下列操作
事务T1:读B;A=B+1;写回A
事务T2:读A;B=A+1;写回B
现给出对这两个事务不同的调度策略
(a)
T1 |
T |