11.1 并发控制概述
多事务执行方式
- 事务串行执行:每个时刻只有一个事务,其他事务必须等他执行完;
- 交叉并发方式:单处理机系统的并发形式;
- 同时并发方式:多处理机系统中,每个处理机执行一个事务;
并发控制机制的任务
- 对并发操作进行正确调度
- 保证事务的隔离性;
- 保证数据库的一致性:不可重复读(1读完后,2进行修改、删除等);丢失修改(2的结果覆盖了1的结果);读“脏”数据(1修改完结果后,被撤销);
11.2 封锁
- 定义:事务T对某个数据对象操作之前,先向系统发出请求对其加锁,值释放之前,其他事务不可以更新此数据对象;
- 基本封锁类型:①排它锁(X锁)②共享锁(S锁);
- 排它锁:事务T给对象A加上排他锁后,只允许T读取和修改A,其他任何事务都不能再给A加上任何锁,直到T释放了A的锁
- 共享锁:T给A加上S锁后,其他事物只可以添加S锁
11.3 封锁协议
一级封锁协议
- 事务T在修改数据之前一定要添加X锁,直到事务结束释放;
- 可以防止丢失修改,但是不可以保证“可重复读”和“读脏数据”
二级封锁协议
- 一级封锁协议+读之前添加S锁,读完释放
- 可以防止丢失修改和读脏数据,不可以保证重复读;
三级封锁协议
- 一级封锁协议+读之前添加S锁,事务结束释放;
- 三个都可以防止!
11.4 活锁和死锁
- 活锁:可能一直等待,采用先来先服务来预防
- 死锁:两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。
- 预防死锁的方法:①一次封锁法:每个事务一次将所有需要的数据加锁;②顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
- 检测死锁的方法:超时法;等待图法;
11.5 并发调度的可串行性
- 注:将所有事务串行起来的调度策略一定是正确的调度策略
- 几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。这种并行调度策略称为可串行化(Serializable)的调度
- 保证并发操作调度正确性的方法:两段锁协议;
11.6 两段锁协议
定义
- 在对任何数据进行读、写操作之前,事务首先要申请并获得对该数据的封锁
- 在释放一个封锁之后,事务不再申请和获得任何其他封锁。
例子
- Slock A … Slock B … Xlock C … Unlock B … Unlock A … Unlock C;(遵循)
- Slock A … Unlock A … Slock B … Xlock C … Unlock C … Unlock B;(不遵循)
原则
- 所有遵守两段锁协议的事务,其并行执行的结果一定是正确的
- 可串行化的调度中,不一定所有事务都必须符合两段锁协议。
两段锁协议 | 三级封锁协议 |
---|---|
保证并发调度的正确性 | 在不同程度上保证数据的一致性 |
遵守第三级封锁协议一定遵循两段锁协议 |