数据库系统
并发控制
基本概念
三种不一致现象
- 丢失修改:非互斥的修改
- 不能重复读:两次读结果不一致
- 脏读:读到错误的值
数据一致性
对共享事务应该反映出一致的状态
事务
一系列操作作为一个整体进行操作和控制
应用程序员控制事务起始和结束
一系列sql语句,直到commit或rollback才标志一个事务结束
DBMS保证事务全部执行或不执行
并发控制
逻辑上对多个事务进行切换执行
通过事务微观交错执行次序的正确安排,保证事务宏观的独立性、完整性和正确性
事务的特性:ACID
- 原子性:全做或不做
- 一致性:正确的
- 隔离性:多个事务间不受影响
- 持久性:提交是持久的和撤销是可恢复的
事务结构
事务管理器
事务调度器:产生调度
锁表:
事务调度和可串行性
事务调度:一组事务的一种执行顺序
并发调度:多个事务宏观上是并发,微观上是交叉执行的。内容上正确。
并发调度的正确性:并发调度的结果和串行结果完全一致
可串行性调度:不管数据库初始状态如何,如果一个调度能保证和串行结果相同那么具有可串行性。形式上正确。
可串行性调度一定是并发调度,并发调度不一定是可串行性调度:可串行性更加严格
可串行性的等效串行序列(串行结果)不一定唯一。
冲突
记号:r1(A),w2(B):事务1读A,事务2写B
冲突:一对事务操作,如果顺序交换那么至少有一个事务的行为会被改变
同一个事务的任何两个操作都是冲突的
不同事务对同一元素的写操作是冲突的
不同事务对同一元素的一读一写操作是冲突的
冲突可串行性:一个通过多次交换相邻两个无冲突操作转换成一个串行调度
冲突可串行性一定满足可串行性,反之不然。
冲突可串行判别算法:
以事务做节点,如果调度中存在冲突则在相应节点间画有向边。若果最后图中没有环则是冲突可串行化的。
基于封锁的并发控制:基于锁
概念
锁:数据锁,提供了控制手段但不能保证冲突可串行性
加锁/解锁:新增的基本操作
锁协议需要考虑的因素
锁的类型:不同类型提高并发性又保证正确性
X排他锁:只有有锁的事务能读写,其他不能读写。写锁
S共享锁:所有事物能读,但都不能写。读锁
U更新锁:初始读锁,后可升级为写锁
I增量锁:区分增量更新好其他更新
相容性矩阵
读写锁协议
更新锁协议
加锁解锁时机:0-3级协议
隔离性级别
分锁粒度:属性-元组-元组集合-关系表-整个数据库
粒度大分锁开销小,并发度小。一般在元组级别加锁
两段分锁协议2PL
读写数据之前要获得锁。每个事务中所有封锁请求先于任何一个解锁请求
两阶段:加锁段,解锁段。加锁段中不能有解锁操作,解锁段中不能有加
锁操作
可能产生死锁
基于时间戳的并发控制:基于撤回
时间戳:一种基于时间的标志,将某一时刻转换成一个数值。唯一性和递增性
事务时间戳:事务启动时赋予时间戳
RT(X):对元素x的最后读时间戳
WT(X):对元素x的最后写时间戳
TS(T):事务T时间戳
简单调度规则
读写并发:TS与WT/RT比较,若大于允许操作,否则撤回T并重启
写写并发:TS与WT比较,若大于允许操作,否则撤回T并重启
另一种调度规则
C(X):最近的写已经提交
当T读请求时:
- TS(T)>=WT(x)时:
- C(X)为真,允许操作
- C(X)为假,推迟T指导C(X)为真
- TS(T)
基于有效性确认的并发控制:基于撤回
基于时间戳:通过判断冲突来强制使事务以可串行化的方式执行。
基于有效性确认:事务读写集合
RS(T):事务T的读数据集合
WS(T):事务T的写数据集合
调度器的三个阶段:
- 读阶段
- 有效性确认阶段
- 写阶段
每个成功确认的事务是在其有效性确认的瞬间执行的。
并发事务的串行顺序即事务有效性确认的顺序。
调度器管理的三个集合:
- START:事务开始时间集合
- VAL:事务有效性确认时间集合
- FIN:事务完成时间集合
有效性确认规则
- 对于所有已经过有效性确认, 且在T开始前没有完成的U, 即对于满足
FIN(U)>START(T)的U,检测:
RS(T)交WS(U)是否为空。
若为空,则确认。否则,不予确认。 - 对于所有已经过有效性确认,且在T有效性确认前没有完成的U, 即对于
满足FIN(U)>VAL(T)的U, 检测:
WS(T)交WS(U)是否为空。
若为空,则确认。否则,不予确认