第十一章.并发控制
1. 并发控制概述
事务是并发控制的基本单位。
目的是为了保证事务的隔离性和一致性
并发操作带来的数据不一致性:
- (1)丢失修改:两个事务读入同一数据并修改,一个事务提交的结果破坏了另一个事物的提交结果,导致被破坏的事务修改被丢失。
- (2)不可重复读:一个事务T1读取数据后,另一个事务T2执行更新,T1这个事务再次读取数据的结果和上一次不同
- (3)读脏数据:一个事务T1修改某一数据,另一事务T2读取同一数据后,T1事务的修改被撤销,则另一个事务T2读到的数据和数据库中的不一致
并发控制的主要技术:封锁、时间戳、乐观控制法、多版本并发控制…
2. 封锁
实现并发控制的一个非常重要的技术。
基本的封锁类型有两种:排他锁和共享锁
- 排它锁(X锁,写锁):若事务T对数据对象A加X锁,只允许T读写,其他任何事务都不能再加对A任何类型的锁,直到T释放这个锁。
- 共享锁(S锁,读锁):若事务T对数据对象A加S锁,T只能读但不能写,其他事务只能对A加S锁
3. 三级封锁协议
- 一级封锁协议:一个事务修改数据时要对数据对象加X锁,直到事务结束释放。可以防止丢失修改。
- 二级封锁协议:一级封锁协议 + 读取数据时要加S锁,读完就释放。可以防止丢失修改、读脏数据。
- 三级封锁协议:一级封锁协议 + 读取数据时要加S锁,事务结束释放。可以防止丢失修改、读脏数据、不可重复读。
区别:什么操作需要申请封锁、何时释放锁
4. 活锁:事务T1申请的封锁对象比较热门,一直有别的事务不停占用,T1永远在等待。
处理方法:先来先服务策略
5. 死锁:T1等待T2封锁占用的资源,T2等待T1封锁占用的资源。导致T1,T2永远不能结束
预防方法:一次封锁法(事务一次将所有数据加锁)、顺序封锁法(预先规定所有的封锁顺序)
诊断方法:超时法、事务等待图法
处理:选择处理死锁代价最小的事务,将其撤销,释放此事务持有的所有锁
6. 可串行化调度:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,成这种调度策略是可串行化调度
可串行化调度是并发事务正确调度的准则
7. 两段锁协议
事务按照时间分为两个阶段:
- 第一阶段是获得封锁,也称扩展阶段,这一阶段事务可以申请任何锁
- 第二阶段是释放封锁,也称收缩阶段,这一阶段事务可以释放任何锁,但是已经不能再申请任何锁了
可以证明所有并发事务遵循两段锁协议,则任何并发调度策略都是可串行化的
8. 封锁的粒度:封锁对象的大小
封锁对象可以是逻辑单元:元组、关系、索引项、索引、数据库,也可以是物理单元:页、物理记录。
9. 意向锁:如果一个结点加意向锁,则说明该结点下层结点正在被加锁
分类:意向共享锁(IS锁)、意向排它锁(IX锁)、共享意向排它锁(SIX锁)。
SIX = S + IX。若对某个表加SIX,表示事务要读整个表,同时要更新个别元组。