第十一章并发控制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

不可串行化的调度
T1
Slock B Y=B=2
T2
Slock A X=A=2
Unlock B Xlock A A=Y+1 写回A(=3)
Unlock A
Xlock B B=X+1 写回B(=3) Unlock B
Unlock A
不可串行化的调度
由于其执行结果与(a)、(b)的结果都不同,所
以是错误的调度。
T2
Slock A X=A=3 Unlock A Xlock B B=X+1 写回B(=4) Unlock B
串行调度策略,正确的调度
T1 T2
SlockA X=A=2 Unlock A Xlock B B=X+1 写回B(=3) Unlock B Slock B Y=B=3 Unlock B Xlock A A=Y+1 写回A(=4) Unlock A
不同级别的封锁协议: 1级封锁协议:对T要“修改”的R加X锁,直到T结 束
(从而避免丢失数据修改,保证事务可恢复) T对R的“读”操作,没作说明,所以可以不加 锁
1级封锁协议只解决“丢失修改”的问题,而另外 两种不能解决
T1 ① Xlock A 获得 ② 读A=16 ③A←A-1 写回A=15 Commit Unlock A ④
避免死锁问题:
两类方法
1. 预防死锁 2. 死锁的诊断与解除
预防死锁的方法:一次封锁法和顺序封锁法
一次封锁法:要求每个事务必须一次将所有要使用
的数据全部加锁,否则就不能继续执行
存在的问题:降低并发度
扩大封锁范围 将以后要用到的全部数据加锁,势必扩大了封锁的范 围,从而降低了系统的并发度
死锁的诊断与解除
允许死锁发生 解除死锁
由DBMS的并发控制子系统定期检测系统中是 否存在死锁 一旦检测到死锁,就要设法解除
死锁检测:超时法
如果一个事务的等待时间超过了规 定的时限,就认为发生了死锁 优点:实现简单 缺点 有可能误判死锁 时限若设置得太长,死锁发生后 不能及时发现
T对R申请S锁: 则允许T对R进行“读”r,不允许“写“w,而其它 事务对R的S申请被允许,X请求拒绝
效果: X锁:数据对象当前只能由一个事务操作。 S锁:多个事务允许同时“读”一个数据。
相容矩阵:
T2
T1
X
N
S N Y Y
Y
X S -
N Y
Y Y
Y=Yes,相容的请求 N=No,不相容的请求
T2
T1
T2 Slock A 读A=2 X=A Unlock A
A=Y+1 写回A=3 Unlock A
Slock A 等待 等待 等待 等待 Slock A 读A=3 X=A Unlock A Xlock B B=X+1 写回B=4 Unlock B
Slock B 读B=2 Y=B Unlock B
Xlock B 等待 Xlock B B=X+1 写回B=3 Unlock B
Xlock A A=Y+1 写回A=3 Unlock A
(a) 遵守两段锁协议
T2
Xlock B
等待 等待
获得Xlock B 读B=100 B←B*2 写回B=200 Commit Unlock B
3级封锁协议:在1级封锁协议的基础上,再加上 T“读”R前加S锁,直到事务结束 题 T“写”R加X锁,直到T结束 T“读”R加S锁,直到T结束 3级封锁进一步避免了“不可重复读”的问
事务的并行执行是这些并行事务的并行操作轮流交叉 运行 是单处理机系统中的并发方式,能够减少处理机的空 闲时间,提高系统的效率
(3)同时并发方式(simultaneous concurrency) 多处理机系统中,每个处理机可以运行一个事务,多 个处理机可以同时运行多个事务,实现多个事务真正 的并行运行 最理想的并发方式,但受制于硬件环境
1、丢失修改:一个事务对数据对象的修改被另一 个事务的修改所覆盖。
T1 ① 读A=16 ② ③ A←A-1 写回A=15 ④ A←A-1 写回A=15 读A=16 T2
2、不能重复读:在一个事务的两次“读”同一数 据之间,有另一个事务的“写”发生
T1 T2
① 读A=50 读B=100 求和=150 ②
T2

Xlock A 等待 等待 等待 等待 获得Xlock A 读A=15 A←A-1 写回A=14 Commit Unlock A
T1
① Xlock A 获得 ② 读A=16 A←A-1 写回A=15 ③ ④ Rollback Unlock A
T2
T1
①读A=50 读B=100 求和=150 ②
读B=100 B←B*2 写回B=200
③ 读A=50 读B=200 求和=250 (验算不对)
3、读“脏”数据,由于一个事物的回滚,使得另 一个事务读到的数据无效。
T1 T2
① 读C=100 C←C*2 写回C ②
读C=200
③ ROLLBACK C恢复为100
造成三种数据不一致性问题的原因: 多事务并行执行时系统无任何限制。 解决: 采用封锁机制,加上必要的限制。
更复杂的并发方式机制
事务并发执行带来的问题
可能会存取和存储不正确的数据,破坏事务的隔 离性和数据库的一致性 DBMS必须提供并发控制机制 并发控制机制是衡量一个 DBMS性能的重要标志 之一
并发控制机制的任务
对并发操作进行正确调度 保证事务的隔离性 保证数据库的一致性
并发操作带来的数据不一致性归纳如下: 丢失修改(lost update) 不可重复读(non-repeatable read) 读“脏”数据(dirty read)
活锁:
死锁
活锁:
避免活锁问题采用先来先服务的策略: 当多个事务请求封锁同一数据对象时 按请求封锁的先后次序对这些事务排队 该数据对象上的锁一旦释放,首先批准申请队列 中第一个事务获得锁
死锁 T1
Xlock R1 . . . Xlock R2 等待 等待 等待 .
T2
. . Xlock R2 . . Xlock R1 等待 等待 .
事务2的封锁序列:
Slock A ... Unlock A ... Slock B ... Xlock C ... Unlock C ... Unlock B;
事务1遵守两段锁协议,而事务2不遵守两段协议。
并行执行的所有事务均遵守两段锁协议,则对这 些事务的所有并行调度策略都是可串行化的。 所有遵守两段锁协议的事务,其并行执行的结果 一定是正确的 事务遵守两段锁协议是可串行化调度的充分条件 ,而不是必要条件 可串行化的调度中,不一定所有事务都必须符合 两段锁协议。
2级封锁协议避免读“脏”数据,但对重复读问题 不能解决
二级封锁协议示例
T1
① Sclock A 获得 读A=50 Unlock A ② Sclock B 获得 读B=100 Unlock B ③ 求和=150
T2
T1 (续)
④Sclock A 获得 读A=50 Unlock A Sclock B 获得 读B=200 Unlock B 求和=250 (验算不对)
什么是封锁机制: 事务T,对数据对象R,操作之前请求对其加锁; 加锁后 :T,对R,有了一定的控制; 在事务T释放它的锁之前,其它的事务不能更新此 数据对象。 封锁是实现并发控制的一个非常重要的技术
基本封锁类型: 排它锁——X锁 共享锁——S锁 T对R申请到X锁: 则只允许T对R进行“读”r、“写”w,其它事 务对R的任何锁请求被拒绝直到T释放R上的X锁 。
不读“脏”数据
T1 ① Xlock C 读C= 100 C←C*2 写回C=200 ② Slock C 等待 等待 等待 等待 获得Slock C 读C=100 Commit C Unlock C T2
③ ROLLBACK (C恢复为100) Unlock C ④

封锁协议小结:
封锁技术可以有效地解决并行操作的一致性问题 ,但也带来一些新的问题
可串行化的调度
T1
Slock B Y=B=2 Unlock B Xlock A A=Y+1 写回A(=3) Unlock A
T2
Slock A 等待 等待 等待 X=A=3 Unlock A Xlock B B=X+1 写回B(=4) Unlock B
可串行化的调度
• 由于其执行结果与串行调度(a)的执行结
等待图法
用事务等待图动态反映所有事务的等待情况
事务等待图是一个有向图G=(T,U) T为结点的集合,每个结点表示正运行的事务
U为边的集合,每条边表示事务等待的情况
若T1等待T2,则T1,T2之间划一条有向边,从T1指向 T2
并发控制子系统周期性地(比如每隔1 min) 检测事务等待图,如果发现图中存在回路,则 表示系统中出现了死锁。

顺序封锁法
预先对数据对象规定一个封锁顺序,所有事务都按这个 顺序实行封锁。
顺序封锁法存在的问题
维护成本高 数据库系统中可封锁的数据对象极其众多,并且随数 据的插入、删除等操作而不断地变化,要维护这样极 多而且变化的资源的封锁顺序非常困难,成本很高
难于实现
事务的封锁请求可以随着事务的执行而动态地 决定,很难事先确定每一个事务要封锁哪些对 象,因此也就很难按规定的顺序去施加封锁。
死锁的诊断与解除
解除死锁
选择一个处理死锁代价最小的事务,将
其撤消,释放此事务持有的所有的锁,
使其它事务能继续运行下去。
问题:
1, 什么样的并发操作调度是正确的
2、如何保证并发操作的调度是正确的
计算机系统对并行事务中并行操作的调度是的随 机的,而不同的调度可能会产生不同的结果。 将所有事务串行起来的调度策略一定是正确的调 度策略。 几个事务的并行执行是正确的,当且仅当其结果 与按某一次序串行地执行它们时的结果相同。这 种并行调度策略称为可串行化(Serializable)的 调度。
T2
读A=15
③读A=50 读B=200 求和=250 (验算不对)
Xlock B 获得 读B=100 B←B*2 写回B=200 Commit Unlock B
2级封锁协议:在1级封锁的基础上,还加上T“ 读”R前加锁,读完即释放 T“写”R放
第十一章 并发控制
解决用户并发执行时,保证DB一致性问题 多事务执行方式 :串行执行,并行执行
(1)事务串行执行
每个时刻只有一个事务运行,其他事务必须等 到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源 的特点
(2)交叉并发方式(interleaved concurrency)
T1 Slock B 读B=2 Y=B Xlock A
T2
A=Y+1 写回A=3 Unlock B Unlock A
Slock A 等待 等待 等待 等待 等待 Slock A 读A=3 Y=A Xlock B B=Y+1 写回B=4 Unlock B Unlock A
T1 Slock B 读B=2 Y=B Unlock B Xlock A
T1 ① Slock A 读A=50 Slock B 读B=100 求和=150 ②
T2
③ 读A=50 读B=100 求和=150 Commit Unlock A Unlock B ④

Xlock B 等待 等待 等待 等待 等待 等待 等待 等待 获得Xlock B 读B=100 B←B*2 写回B=200 Commit Unlock B
果相同,所以是正确的调度。
两段锁协议的内容 1. 在对任何数据进行读、写操作之前,事务首 先要获得对该数据的封锁 2. 在释放一个封锁之后,事务不再获得任何其 他封锁。
例: 事务1的封锁序列:
Slock A ... Slock B ... Xlock C ... Unlock B ... Unlock A ... Unlock C;
例:现在有两个事务,分别包含下列操作: 事务1:读B;A=B+1;写回A; 事务2:读A;B=A+1;写回B;
假设A的初值为2,B的初值为2。
T1,T2: A=3,B=4;
T2,T1: A=4,B=3.
串行调度策略,正确的调度
T1
Slock B Y=B=2 Unlock B Xlock A A=Y+1 写回A(=3) Unlock A
相关文档
最新文档