作者:Fealty-小飞 | 来源:互联网 | 2023-07-04 10:10
封锁
- 封锁就是事务T在对某个数据对象(表、记录等)操作之前,先向系统发出请求,对其枷锁
- 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象
- 封锁是实现并发控制的一个非常重要的技术
封锁类型
- 基本封锁类型
- 排它锁(eXclusive lock,简称X锁)
- 共享锁(Share lock,简称S锁)
排它锁
- 排它锁又称为写锁、X锁
- 若事务T1对数据对象A加上X锁,则只允许T1读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T1释放A上的X锁
共享锁
- 共享锁又称为读锁、S锁
- 若事务T1对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T1释放A上的S锁
封锁类型的相容性
| |
---|
| | X | S | - |
---|
X | N | N | Y |
S | N | Y | Y |
- | Y | Y | Y |
Y=Yes,相容的请求
N=No,不相容的请求
封锁粒度
- X锁和S锁都是加在某一个数据对象上的
- 封锁的数据对象可以是逻辑单元
- 属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等
- 封锁的数据对象也可以是物理单元
- 页(数据页或索引页)、块等
- 封锁对象可以是大或者很小
- 封锁对象的大小称为封锁的粒度
- 封锁粒度与系统的并发度和并发控制的开销密切相关
封锁的粒度 | 被封锁的对象 | 并发度 | 系统开销 |
---|
大 | 少 | 低 | 小 |
小 | 多 | 高 | 大 |
- 选择封锁粒度时必须同时考虑开销和并发度两个因素,进行权衡,以求的最优的效果
封锁粒度一般原则
- 需要处理大量元组的用户事务
- 需要处理多个关系的大量元组的用户事务
- 只处理少量元组的用户事务
封锁协议
- 在运用X锁和S锁数据对象加锁时,需要约定一些规则,这些规则为封锁协议(Locking Protocol)
- 两种封锁协议
- 三级封锁协议——保证数据一致性
- 两段锁协议——保证并行调度可串行型
三级封锁协议
- 一级封锁协议
- 事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放
- 正常结束(commit)
- 非正常结束(rollback)
- 一级封锁协议可防止丢失修改,并保证事务T是可恢复的
- 在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所有它不能保证可重复读和不读“脏”数据
- 二级封锁协议
- 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即释放S锁
- 二级封锁协议可以防止丢失修改和读“脏”数据
- 三级封数据锁协议
- 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放
- 三级封锁协议可防止丢失修改、读“脏”数据和不可重复读
三级协议的主要区别
什么操作需要申请封锁以及何时释放锁(持锁时间)
| X锁 | S锁 | 一致性保证 |
---|
| 操作结束释放 | 事务结束释放 | 操作结束释放 | 事务结束释放 | 不丢失修改 | 不读“脏”数据 | 可重复读 |
---|
一级封锁协议 | | ✔ | | | ✔ | | |
---|
二级封锁协议 | | ✔ | ✔ | | ✔ | ✔ | |
---|
三级封锁协议 | | ✔ | | ✔ | ✔ | ✔ | ✔ |
---|