一、事务的特性
事务的ACID特性:
• 原子性(Atomicity):事务中包括的诸操作要么都做,要么都不做
• 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
• 隔离性(Isolation):一个事务内部的操作及使用的数据对其他并发事务是隔离的
• 持续性(Durability ):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
二、封锁的并发控制技术
基本封锁类型
– 排它锁(eXclusive lock,简记为X锁)
– 共享锁(Share lock,简记为S锁)
三级封锁协议:在不同程度上保证数据一致性
a)1级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放.在1级封锁协议中,如果是读数据,不需
要加锁的,所以它不能保证可重复读和不读“脏”数据。
b)2级封锁协议:1级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可释放S锁.在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
c)3级封锁协议:1级封锁协议+ 事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放.3级封锁协议可防止丢失修改、读脏数据和不可重复读。
两段锁协议:保证并发调度的正确性
两段锁协议的内容
– 1. 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
– 2. 在释放一个封锁之后,事务不再获得任何其他封锁。
“两段”锁的含义
– 事务分为两个阶段
• 第一阶段是获得封锁,也称为扩展阶段;
• 第二阶段是释放封锁,也称为收缩阶段。
如:Slock A ... Slock B ... Xlock C ...Unlock B ... Unlock A ... Unlock C;
两段锁协议补充:
• 并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。
• 所有遵守两段锁协议的事务,其并行执行的结果一定是正确的
• 事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件
• 可串行化的调度中,不一定所有事务都必须符合两段锁协议。
三、死锁及解决方法
预防死锁的方法:
1)一次封锁法:要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度。难于事先精确确定封锁对象。
2)顺序封锁法:顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
维护成本高,难于实现。
结论
– 在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点
– DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法
死锁的诊断与解除:
•允许死锁发生
• 解除死锁
– 由DBMS的并发控制子系统定期检测系统中是否存在死锁
– 一旦检测到死锁,就要设法解除
检测死锁:
a)超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁.
b)等待图法:并发控制子系统周期性地(比如每隔1 min)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。
解除死锁:选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务能继续运行下去。