Note10- 并发控制

事务

事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

事务的特性:

并发执行和调度

调度就是一个或多个事务的重要操作按时间排序的一个序列。如果不管数据库初始状态如何,一个调度对数据库状态的影响都和某个串行调度相同,则我们说这个调度是可串行化的。

优先关系

已知调度 S,其中涉及事务 T1 和 T2,可能还有其他事务。我们说 T1 优先于 T2,记作 T1 < T2,如果有 T1 的动作 A1 和 T2 的动作 A2,满足:

因此,在任何冲突等价于 S 的调度中,A1 将出现在 A2 前。所以,如果这些调度中有一个是串行调度,那么该调度必然使 T1 在 T2 前。

优先图

优先图的结点是调度 S 中的事务。当这些事务是具有不同的 i 的 Ti 时,我们将仅用整数 i 来表示 Ti 的结点。如果 Ti < Tj,则有一条从结点 i 到结点 j 的弧。

如,假设有一个事务序列为:r2(A); r1(B); w2(A); r3(A); w1(B); w3(A); r2(B); w2(B);

事务 T1 不对 A 操作,而它最先对 B 操作,显然 T1 优先级最高,调度图如下:

冲突可串行性判定

就是看优先图中有没有环。

并发控制协议

基于锁的协议

锁是数据项上的并发控制标志。锁可以分为两种类型:

给定一个各种类型锁的集合,如下定义这个锁集合上的相容关系:

死锁

产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。

如何预防死锁呢?

等待图

事务等待图是一个有向图,结点表示正运行地事务,每条边表示事务地等待情况,若 T1 等待 T2,则 T1, T2 之间划一条有向边

并发控制子系统周期性地生成等待图。如果发现图中存在回路,则表示系统中出现了死锁。

死锁的恢复

两段锁协议

两阶段锁协议要求每个事务分两个阶段进行数据项的加锁和解锁,每个事务中所有封锁请求先于任何一个解锁请求。

基于时间戳的协议

另一种决定事务可串行化次序的方法是事先选定事务的次序,最常见的方法是时间戳排序机制。

对于系统中每个事务 Ti,我们把一个唯一的固定时间戳和它联系起来,记为 TS(Ti),如有一新事物 Tj 进入系统,则 TS(Ti) < TS(Tj)

每个数据项 Q 需要与两个时间戳值关联

时间戳协议

Thomas 写规则