并发控制-概述
并发操作,是指在多用户共享的系统种,许多用户可能对同一数据进行操作。并发操作破坏了事务的隔离性导致数据库数据的不一致性,主要有三类:丢失更新,不科重复读和读脏数据。DBMS的并发控制了之系统负责协调并发事务的执行,保证数据库的完整性不受破坏,避免用户得到不正确的数据。DBSM的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不受破坏,避免用户得到不正确的数据。
事务调度的概念
- 调度(schedule):事务的执行次序
- 串行调度(serial schedule): 多个事务依次串行执行,且只有当一个事务的所有操作都执行完后才行另一个事务的所有操作。
- 并行调度(concurrentschedule): 利用分时的方法同时处理多个事务
串行调度案例
eg
设有两个事务TO和TI,事务TO从账号A转2000元到账号B;事务TI从账号A转20%的款到账号B
-
A, B的初始值为10000和20000
(a)执行结果: A=6400,B=23600
(b)执行结果: A=6000,B=2400
1-1.png
并行调度案例
- A,B的初始值为10000和20000
- (a)执行结果: A=6400,B=23600
- (b)执行结果:A=8000,B=2400
注:多个事务的并发执行是正确的,当且仅当其结果与按某一次串行执行这些事务时的结果相同
并发操作带来的数据不一致性有三类:丢失修改,不可重复读(读幻影),读脏数据
解决方法:
利用封锁技术保障事务的隔离性
并发控制-封锁
并发控制的主要技术是封锁。封锁就是事务T在对某个数据对下(例如表,记录等)访问之前,先向系统发出请求,对其加锁。
基本锁类型
- 排他锁(Exclusive Locks,简记为X锁):写
- 共享锁(Share Locks,简记为S锁): 读
读占锁
排他写
三级封锁协议 - 一级封锁协议:
内容:
事务在修改数据之前,必须先对该数据加X锁,直到事务结束时才释放。但只读数据的事务可以不加锁
优点:
防止“丢失修改”
缺点:
不加锁的事务,可能“读脏数据”,也可能“不可重复读”
二级封锁协议:
内容
事务在修改数据之前,必须先对该数据加X锁,直到事务结束时才释放,但其他事务读数据之前必须先加S锁,读完后即释放S锁
优点:
防止‘丢失修改’,防止‘读脏数据’
确定:
对加S锁的事务,可能‘不可重复读’
三级封锁协议:
事务在修改数据之前,必须先对该数据加X锁,直到事务结束时才释放,但其他事务读数据之前必须先加S锁,直到事务结束才能释放S锁
优点:
防止‘丢失修改’
防止‘读脏数据’
防止‘不可重复读’
封锁技术可以有效的解决并行操作的一致性问题,但是也带来一些新的问题
- 活锁(饿死):低级优先级事务,一直永久等待,无法执行
- 死锁(循环争用):两个或多个事务相互封锁了对方数据,出现死等待
避免活锁
采用先来先服务,或事务优先级调度
解决死锁
- 预防死锁: 一次封锁法,顺序封锁法
- 死锁的诊断与解除
诊断:并发控制子系统周期性地(比如每隔秒数)生成事务等待图,检测事务。如果发现图中存在回路,则表示系统种出现了死锁
解除:选择一个处理死锁代价最小的事务,将其撤销,释放其占有的资源
封锁协议
运用封锁方法时,对数据对下加锁时需要约定一些规则
何时申请锁,持锁时间,何时释放封锁
两段封锁协议:理论上证明使用两段封锁协议产生的是可串行化调度。事务必须分两个阶段对数据项加锁和解锁
第一阶段是获得锁,也称为扩展阶段:事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁
第二阶段是释放锁,也称为收缩阶段:事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁
eg:事务Ti遵守两段锁协议,其封锁序列是:
Slock A SlockB XLockC
扩展阶段
UnlockB UnlockA UnlockC
收缩阶段
事务Tj不遵守两段锁协议,其封锁序列是:
Slock A UnlockA
SlockB Xlock C
Unlock C Unlock B
封锁粒度
- 封锁对象的大小称为封锁粒度
- 封锁的对象:逻辑单元,物理单元
1.逻辑单元:属性值,属性值集合,元组,关系,索引项,整个索引,整个数据库等
2 物理单元:页(数据页和索引页)。物理记录等 - 封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的粒度越小,并发度较高,但是系统开销也就越大