数据库理论(七)——并发控制
数据库理论(七)——并发控制
并发控制的任务:
1. 对并发操作进行正确调度
2. 保证事物的隔离性
3. 保证数据库的一致性
并发操作可能带来的数据不一致性:
- 丢失修改
- 不可重复读
- 读“脏”数据
辅助符号:
- R(X):读数据x
- W(X):写数据x
并发控制的基本理念
- 封锁(Locking)
- 时间戳(Timestamp)
- 乐观控制法
商用的DBMS通常采用封锁发方法
封锁
封锁指事物T在对某个数据对象(表,记录)操作之前,先向系统发出请求,对其加锁;
加锁后,事物T就对该数据对象有了一定的控制,在事物T1释放它的锁之前,其他事物不能更新此数据对象。
事物对数据对象加锁的类型决定了事物对数据对象的控制
- 排他锁(Exclusive Locks,简记为X锁,写锁)
- 事物T在更新数据对象之前,必须先获得数据对象的排他锁
- 若事物T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事物都不能在对A加任何类型的锁
- 共享锁(Share Locks,简记为S锁,读锁)
- 事物T在读取数据对象之前,必须先获得数据对象的共享锁
- 若事物T对数据对象A加上S锁,则其他事物只能再对A加上S锁,而不能加上X锁,直到T释放A上的S锁
封锁的积极面:
让访问同一数据对象的事物保持隔离性(互斥访问),保证了数据的一致性
封锁的副作用:
1. 加锁和解锁的开销会降低数据的操作性能
2. 会出现一些特殊的加锁情况
1. 死锁:两个及以上的事物在相互等待,使得CPU的使用率为0
2. 活锁:某个事物一直处于等待状态而无法被执行
如何判断两个事物能否并发进行
读写和写写的事物不能并发进行,读读的事物能并发进行
怎么理解这句话呢,
可以举个例子
事物T1要执行W(x),R(y)
事物T2要执行R(x)
从上面的两个事物中都对x进行了操作,T1要写x,T2要读x,这与上面加粗的读写情况相同,因此不能并发进行
再举个例子:
事物T1要执行W(x),R(y)
事物T2要执行W(x)
从上面的两个事物中都对x进行了操作,T1要写x,T2要写x,这与上面加粗的写写情况相同,因此不能并发进行
最后举个例子
事物T1要执行R(x),W(y)
事物T2要执行R(x)
从上面的两个事物中都对x进行了操作,T1要写x,T2要写x,这与上面加粗的读读情况相同,因此可以并发进行
可串行调度
多个事物的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事物时的结果相同。
如何判断一个调度是可串行化的调度呢?
并发结果与任意一种串行运行结果相同即为可串行化的调度
为冲突可串行化调度一定为可串行化调度,反之不然。
冲突可串行化调度是指当前的并行事物读写操作,能够经过某种合理交换操作,实现任意一种串行的结果即为冲突可串行化调度。
两段锁协议
事物分两个阶段对数据项加锁和解锁
第一阶段:拓展阶段(申请并获得封锁)
1. 事物可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁
第二阶段:收缩阶段(释放封锁)
- 事物可以释放任何数据项上的任何类型的锁,但是在释放一个封锁之后,事物不能再申请和获得任何其他封锁
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ZeroRains Blog!