第十一章 并发控制
并发的概念
- 单处理器系统:事务并行操作轮流交叉运行
- 多处理器系统:同时并发方式,多个事务真正并行
并发带来数据一致性的问题
- 丢失修改
- 两个事务同时对同一个数据进行修改
- 不可重复读
- T1读取某一数据后,T2执行更新操作,T1无法再现前一次读取的结果
- T1读取某数据后,T2删除了某些数据,发现记录神秘地消失了
- T1读取某些数据后,T2添加了某些数据,发现某些记录神秘地消失了
- 读“脏“数据
- 读取的数据和数据库中的数据不一致
并发控制的主要方式
- 封锁
- 时间戳
- 乐观控制法
- 多版本并发控制
封锁
- 排他锁(写锁)exclusive lock
- 共享锁(读锁)share lock
相容矩阵
T1/T2 | X | S |
---|---|---|
X | N | N |
S | N | Y |
封锁协议
- 一级封锁协议
- 在修改前必须对数据加X锁
- 解决了丢失修改
- 二级封锁协议
- 在一级封锁协议的基础上,加上在读取数据前必须加S锁,读完即可释放
- 解决了不读脏数据和丢失修改
- 三级封锁协议
- 在一级封锁协议的基础上,加上读取数据前必须加S锁,直到事务结束
- 解决了不可重复读,不读脏数据,丢失修改
活锁和死锁
- 活锁的避免:采用先来先服务策略
- 死锁:T1等待T2,T2又在等待T1
- 死锁的预防:
- 一次封锁法:要求将要加锁的东西全部加锁
- 顺序封锁法:对事务对象规定一个封锁顺序,所有事务按一个顺序封锁
死锁的诊断和解除
- 超时法
- 等待图法
并发调度的可串行性
- 定义:多个事务并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时结果相同
- 冲突可串行化调度
- 冲突操作:不同的事务对同一个数据的读写操作和写写操作
- 冲突操作的顺序是不可调换的
二段锁协议
- 第一阶段:(扩展阶段)获得锁
- 第二阶段:(收缩阶段)释放锁
- 是冲突可串行化的充分条件
封锁的粒度
- 封锁对象的大小称为封锁的粒度
- 多粒度封锁:一个结点加锁意味着其后裔节点也被加同样的锁
- 显式封锁:应事务的要求直接加到数据对象上的锁
- 隐式封锁:该数据对象没用被独立加锁,由于其上层节点被加了锁而被加锁
- 意向锁