wom知道事务的ACID特性被破坏的原因之一就是多个事务对数据库的并发操作造成的。所以 数据库管理系统需要对这些并发操作进行正确的调度,并发控制机制就是用正确的方式调度并发操作,使一个用户事务不收其他事务的干扰。
并发控制的技术主要有封锁,时间戳,乐观控制发和多版本并发控制等
1. 封锁
基本的封锁类型有:排他锁(X锁,写锁)和共享锁(S锁,读锁)
数据库中的共享锁和排他锁:https://blog.csdn.net/qq_41386300/article/details/101937234
1.1 封锁协议
封锁协议:何时申请锁,持锁时间,何时释放
-
一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放
只能避免事务的丢失更新 -
二级封锁协议
在一级的基础上增加:事务T在读取数据R之前必须加S锁,,读完后释放
进一步避免了脏读 -
三级封锁协议
一级的基础是上增加:事务T在读取数据R之前必须加S锁,,事务结束后释放
进一步避免了不可重复读
1.2 活锁和死锁
活锁
如果事务T1封锁里数据R,事务T2也请求封锁R,T2等待,事务T3也请求封锁R,当T1释放里R的锁后,系统首先批准了T3的请求,T2继续等待,然后T4又请求封锁R,T3释放锁后系统又批准里T4的请求…T2有可能永远等待,这就是活锁的情形
避免活锁的简单方法是采用先来先服务策略
死锁
死锁就是循环等待的情形
数据库中解决死锁问题主要有两类办法:一是采取一定措施预防死锁的发生;二是定期诊断是否有死锁,有则解除它
- 死锁预防
- 一次封锁法
每个事务都一次性将所有要使用的数据全部加锁 - 顺序封锁法
预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实施封锁
- 一次封锁法
数据库中普遍采用诊断并解除的方法
- 死锁诊断与解除
- 死锁诊断
- 超时法
如果一个事务等待时间超过了规定的时间,就认为发生里死锁
缺点:一是有可能误判;二是若时间设置太长,死锁发生后不能及时发现 - 等待图法
事务等待图是一个有向图G=(T,U),T为结点集合,u为边集合,若事务T1等待T2,则画一条由T1指向T2的边
并发控制子系统周期性的生成事务等待图,并进行检测,如果发现图中存在回路,则表示系统中出现里死锁
- 超时法
- 死锁解除
通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有锁,当然,对撤销的事务所做的数据修改操作必须恢复
- 死锁诊断
2. 时间戳
给每一个事务盖上一个时标,即事务开始执行的时间,每个事务具有唯一的时间戳,如果发生冲突操作,就回滚具有较早时间戳的事务,以保证其他事务的正常执行,被回滚的事务被赋予一个新的时间戳并从头开始执行
3. 乐观控制法
乐观控制法认为很少发生冲突,一次不对事务进行特殊的管制,而是让他自由执行,事务提交前再进行正确性检查,如果检查后发现该事务出现过冲突,则拒绝执行并回滚
4. 多版本并发控制
版本是指数据对象的一个快照,记录数据对象某个时刻的为状态。
有一个数据对象A有两个事务,T1是写事务,T2是读事务,先启动T1后启动T2,T1在写A时,为A生成一个新的版本A‘,那么T2就可以继续在T1上执行,,T2提交的时候要先检查T1是否完成,如果T1已完成则T2可以提交,否则T2等待直到T1完成。