第十一章 并发控制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18
(1)一次封锁法 一次封锁法要求每个事务必须一次将所有要使用的数据全
部加锁,否则就不能继续执行。
一次封锁法虽然可以有效地防止死锁的发生,但也存在问 题,一次就将以后要用到的全部数据加锁,势必扩大了封锁 的范围,从而降低了系统的并发度。 由于数据库中数据不断变化着的,原来不要求封锁的数据,
可 串 行 化 的 调 度
数据库概论
(d)
28
§11.4.2 冲突可串行化调度 冲突(conflict)操作:
当Ii与Ij是不同事务在相同的数据项的操作,并且其中至
少有一个是write指令时,我们说Ii与Ij是冲突的。即冲突操作: 指不同的事务对同一个数据的读写操作和写写操作
共享锁(Share lock,简记为S锁)
共享锁:又称为读锁。若事务T对数据对象A加上S锁, 则其它事务只能再对A加S锁,而不能加X锁,直到T释放 A上的S锁。这就保证了其它事务可以读A,但在T释放A 上的S锁之前不能对A做任何修改
数据库概论
10
T1
(1)XL A (2)读A=16
T2
请求XL A 等待 等待 等待 等待 等待 获得XL A 读A=15 AA-1 写回A=14 Commit Unlock A
第十一章 并发控制
§ 11.1 并发控制概述
§ 11.2 封锁
§ 11.3 活锁和死锁
§ 11.4 并发调度的可串行性 § 11.5 两段锁协议 § 11.6 封锁的粒度 § 11.7 小结
数据库概论
1
并发控制 多个用户同时存取数据库时会产生多个事务同时存取同一数据
的操作,称为并发操作
在串行调度中,属于同一事务的指令紧挨在一起 对于有n个事务的事务组,可以有n!个有效调度
(3)并行调度
在并行调度中,来自不同事务的指令可以交叉执行 当并行调度等价于某个串行调度时,则称它为正确的
(4)可串行化的调度 多个事务的并发执行是正确的,当且仅当其结果与按某 一次序串行地执行这些事务时的结果相同
T2 . . Xlock R2 . . Xlock R1 等待 等待 .
T2 封锁了数据 R2 ,然后 T1 又请求
封锁 R2 ,因 T2 已封锁了 R2 ,于是 T1 等待 T2 释放 R2 上的锁。接着 T2 又申请封锁 R1 ,因 T1 已封锁了 R1 , T2 也只能等待 T1 释放 R1 上的锁。
Read:A=16. A←A*2 Write: A=32
Read:A=32. RollBack A 恢复到16 Read:A=16. 读脏数据 4
数据库概论
并发操作带来的三类数据不一致性 丢失修改(lost update)
不可重复读(non-repeatable read)
读“脏”数据(dirty read)
在执行过程中可能会变成封锁对象,所以很难先精确地确定
每个事务所有要封锁的数据对象。 解决方法:将事务在执行过程中可能要封锁的数据对象全 部加锁,这样就进一步降低了并发度。
数据库概论
19
(2)顺序封锁法 顺序封锁法是预先对数据对象规定一个封锁顺序,所有
事务都按这个顺序实行封锁。
顺序封锁法可以有效地防止死锁,但也同样存在问题:
难于实现:பைடு நூலகம்务的封锁请求可以随着事务的执行而动
态地决定,很难事先确定每一个事务要封锁哪些对象,
因此也就很难按规定的顺序去施加封锁 维护成本高:DBS中可封锁的数据对象极其众多,并且 随数据的插入、删除等操作而不断地变化,要维护这样
极多而且变化的资源封锁顺序非常困难,成本很高
数据库概论
20
2. 死锁的诊断与解除 在OS中广为采用的预防死锁的策略并不很适合DB的特点, DBMS在解决死锁的问题上更普遍采用的方法是诊断并解除死 锁的方法。 死锁的诊断与解除 允许死锁的发生 解除死锁:由DBMS的并发控制子系统定期检测系统中是 否存在死锁,一旦检测到死锁,就要设法解除
数据库概论
9
二、基本封锁类型 一个事务对某个数据对象加锁后究竟拥有什么样的控制是由 封锁的类型决定的。DBMS通常提供了多种类型的封锁。 基本封锁类型
排它锁(eXclusive lock,简记为X锁)
排它锁:又称为写锁。若事务T对数据对象A加上X锁, 则只允许T读取和修改A,其它任何事务都不能再对A加 任何类型的锁,直到T释放A上的锁。这就保证了其它事 务在T释放A上的锁之前不能再读取和修改A。
数据库管理系统必须提供并发控制机制 并发控制机制是衡量一个数据库管理系统性能的重要标志之一
数据库概论
2
§11.1 并发控制概述 并发控制机制的任务 对并发操作进行正确调度
保证事务的隔离性
保证数据库的一致性
数据库概论
3
§11.1并发控制概述
例:考虑飞机订票系统中的一个活动序列:
甲售票点(甲事务)
其中:
T为结点的集合,每个结点表示正运行的事务; U为边的集合,每条边表示事务等待的情况。 在事务之间用有向弧表示事务之间的等待情况 事务等待图动态地反映了所有事务的等待情况
并发控制子系统周期性地(比如每隔1分钟)检测事务等待
图,如果发现图中存在回路,则表示系统中出现了死锁。 T1
数据库概论
发现某些记录神密地消失了。
3.事务2插入了一些记录,当事务1再次按相同条件读取 数据时,发现多了一些记录。
数据库概论
后两种也称 为幻影现象
7
问题产生原因及解决技术 产生上述三类数据不一致性的主要原因 并发操作破坏了事务的隔离性 并发控制就是要用正确的方式调度并发操作,使一个用户事
务的执行不受其它事务的干扰,从而避免造成数据的不一致性
N
T2
T1
S N Y Y
Y
X S -
N Y
Y Y
Y=Yes,相容的请求 N=No,不相容的请求
数据库概论
12
§11.3 活锁和死锁 封锁技术可以有效地解决并行操作的一致性问题,但
也带来一些新的问题
死锁
活锁
数据库概论
13
§11.3.1 活锁
如果事务T1封锁
了数据R,事务T2 又请求封锁R,于 是T2等待。T3也请 求封锁R,当T1释 放了R上的封之后 系统首先批准了T3 的请求,T2仍然等 待。然后T4又请求 封锁R,当T3释放 了R上的封锁之后 系统又批准了T4的 请求,...,T2有 可能永远等待,这 就是活锁的情形
诊断方法:
超时法 事务等待图法
数据库概论
21
(1)检测死锁:超时法 如果一个事务的等待时间超过了规定的时限,就认为发生
了死锁
优点:实现简单 缺点
有可能误判死锁 时限若设臵得太长,死锁发生后不能及时发现
数据库概论
22
(2)检测死锁:事务等待图法 事务等待图是一个有向图G=(T,U)
请求SL C 等待 等待 等待 等待 等待
(3) ROLLBACK (C恢复为100) Unlock C
没有丢失修改
获得XL B 读B=100 B B× 2 写回 B=200 Commit Unlock B
(4)
获得SL C 读C=100 Unlock C
不再读“脏”数据
数据库概论
可重复读
11
三、锁的相容矩阵 X
数据库概论
5
1. 丢失修改
丢失修改是指事务 1 与事务 2 从数据库中读入同一数据并修 改,事务2的提交结果破坏了事务1提交的结果,导致事务1的 修改被丢失。
2. 读“脏”数据 事务 1 修改某一数据,并将其写回磁盘,当事务 2 读取同一
数据后,事务 1 由于某种原因被撤消,这时事务 1将已修改过
T1
(1)SL A=50 SL B=100 读A,B 求和A+B=150 (2)
T2
T1
(1)XL C 读C=100 CC×2 写回C=200
T2
(3)AA-1 写回A=15 Commit Unlock A (4)
请求XL B 等待 等待 等待
(2)
(3) 读A=50,B=100 求和A+B=150 Commit Unlock A Unlock B (4)
丢失修改
乙售票点(乙事务)
Read某航班的机票余额A, A=16. Read同一航班的机票余额A, A=16. A←A-1. Write: A=15 A←A-1. Write: A=15
甲售票点 (甲事务) 乙售票点 (乙事务)
不可重复读
甲售票点 (甲事务) 乙售票点 (乙事务)
Read:A=16. Read:B=16 A+B=32 Read:B=16. B←B*2 Write:B=32 Read:A=16. Read:B=32 A+B=48 (验算不对)
这样就出现了 T1 在等待 T2 ,而 T2
又在等待 T1 的局面, T1 和 T2 两个 事务永远不能结束,形成死锁。
数据库概论
16
产生死锁的原因 在数据库中,产生死锁的原因 是两个或多个事务都已封锁了一些数据对象,然后又都请
求对已为其他事务封锁的数据对象加锁,从而出现死等待。
数据库概论
17
数据库概论
14
如何避免活锁 避免活锁简单方法是采用先来先服务的策略 当多个事务请求封锁同一数据对象时 按请求封锁的先后次序对这些事务排队 该数据对象上的锁一旦释放,首先批准申请队列中第
一个事务获得锁。
数据库概论
15
§11.3.2 死锁 如果事务T1封锁了数据R1,
T1 Xlock R1 . . . Xlock R2 等待 等待 等待 .
t4 t5 t6 t7 t8
写回A(=3) Unlock A
(a)串行调度(1) 数据库概论
(b)串行调度(2)
26
事务的并行调度
事务 T1 Slock B Y=B=2 Slock A T2
时序列
数据库概论
(c) 不 可 串 行 化 的 调 度
t1 t2 t3 t4 t5 t6 t7 t8
X=A=2
T2
23
2. 死锁的诊断与解除 解除死锁 选择一个处理死锁代价最小的事务,将其撤消,释放此 事务持有的所有的锁,使其它事务能继续运行下去。并且
对撤消的事务所执行的数据修改操作必须加以恢复。
数据库概论
24
§11.4 并发调度的可串行性 几个概念 (1)调度: 事务的执行顺序称为一个调度,表示事务的指令在系统 中执行的时间顺序 (2)串行调度
Unlock B Unlock A Xlock A A=Y+1写回A(=3) Xlock B B=X+1写回B(=3) Unlock A Unlock B
27
事务的并行调度
事务 时序列 t1 Slock B Y=B=2 t2 t3 t4 t5 t6 t7 t8 Unlock B Xlock A Slock A A=Y+1写回A(=3) Unlock A 等待 等待 X=A=3 Unlock A Xlock B B=X+1写回B(=4) Unlock B T1 T2
的数据恢复原值。事务2读到的数据就与数据库中的数据不一 致,是不正确的数据,又称为“脏”数据。
数据库概论
6
3. 不可重复读 不可重复读 指事务 1 读取数据后,事务 2 执行更新操作,使事务 1 无 法再现前一次读取结果。 不可重复读包括三种情况: 事务1读取某一数据后: 1.事务2对其做了修改,当事务1再次读该数据时,得到 与前一次不同的值。 2.事务2删除了其中部分记录,当事务1再次读取数据时,
数据库概论
25
事务的串行调度
事务 时序列 T1 T2 T1 T2
t1
t2 t3
Slock B
Y=B=2 Unlock B Xlock A
Slock A
X=A=2 Unlock A Xlock B
A=Y+1
B=X+1
写回B(=3) Unlock B Slock A X=A=3 Unlock A Xlock B B=X+1写回B(=4) Unlock B Slock B Y=B=3 Unlock B Xlock A A=Y+1写回A(=4) Unlock A
解决死锁的方法 两类方法
1. 预防死锁
2. 死锁的诊断与解除
1. 死锁的预防
产生死锁的原因:是两个或多个事务都已封锁了一些数据
对象,然后又都请求对已为其他事务封锁的数据对象加锁, 从而出现死等待
预防死锁的发生就是要破坏产生死锁的条件
预防死锁通常有两种方法:
一次封锁法
顺序封锁法
数据库概论
并发控制的主要技术是封锁(Locking)
数据库概论
8
§11.2 封锁
一、什么是封锁 封锁
就是事务T在对某个数据对象(例如表、记录等)操作
之前,先向系统发出请求,对其加锁 加锁后事务T就对该数据对象有了一定的控制,在事务T释 放它的锁之前,其它的事务不能更新此数据对象。 封锁是实现并发控制的一个非常重要的技术
(1)一次封锁法 一次封锁法要求每个事务必须一次将所有要使用的数据全
部加锁,否则就不能继续执行。
一次封锁法虽然可以有效地防止死锁的发生,但也存在问 题,一次就将以后要用到的全部数据加锁,势必扩大了封锁 的范围,从而降低了系统的并发度。 由于数据库中数据不断变化着的,原来不要求封锁的数据,
可 串 行 化 的 调 度
数据库概论
(d)
28
§11.4.2 冲突可串行化调度 冲突(conflict)操作:
当Ii与Ij是不同事务在相同的数据项的操作,并且其中至
少有一个是write指令时,我们说Ii与Ij是冲突的。即冲突操作: 指不同的事务对同一个数据的读写操作和写写操作
共享锁(Share lock,简记为S锁)
共享锁:又称为读锁。若事务T对数据对象A加上S锁, 则其它事务只能再对A加S锁,而不能加X锁,直到T释放 A上的S锁。这就保证了其它事务可以读A,但在T释放A 上的S锁之前不能对A做任何修改
数据库概论
10
T1
(1)XL A (2)读A=16
T2
请求XL A 等待 等待 等待 等待 等待 获得XL A 读A=15 AA-1 写回A=14 Commit Unlock A
第十一章 并发控制
§ 11.1 并发控制概述
§ 11.2 封锁
§ 11.3 活锁和死锁
§ 11.4 并发调度的可串行性 § 11.5 两段锁协议 § 11.6 封锁的粒度 § 11.7 小结
数据库概论
1
并发控制 多个用户同时存取数据库时会产生多个事务同时存取同一数据
的操作,称为并发操作
在串行调度中,属于同一事务的指令紧挨在一起 对于有n个事务的事务组,可以有n!个有效调度
(3)并行调度
在并行调度中,来自不同事务的指令可以交叉执行 当并行调度等价于某个串行调度时,则称它为正确的
(4)可串行化的调度 多个事务的并发执行是正确的,当且仅当其结果与按某 一次序串行地执行这些事务时的结果相同
T2 . . Xlock R2 . . Xlock R1 等待 等待 .
T2 封锁了数据 R2 ,然后 T1 又请求
封锁 R2 ,因 T2 已封锁了 R2 ,于是 T1 等待 T2 释放 R2 上的锁。接着 T2 又申请封锁 R1 ,因 T1 已封锁了 R1 , T2 也只能等待 T1 释放 R1 上的锁。
Read:A=16. A←A*2 Write: A=32
Read:A=32. RollBack A 恢复到16 Read:A=16. 读脏数据 4
数据库概论
并发操作带来的三类数据不一致性 丢失修改(lost update)
不可重复读(non-repeatable read)
读“脏”数据(dirty read)
在执行过程中可能会变成封锁对象,所以很难先精确地确定
每个事务所有要封锁的数据对象。 解决方法:将事务在执行过程中可能要封锁的数据对象全 部加锁,这样就进一步降低了并发度。
数据库概论
19
(2)顺序封锁法 顺序封锁法是预先对数据对象规定一个封锁顺序,所有
事务都按这个顺序实行封锁。
顺序封锁法可以有效地防止死锁,但也同样存在问题:
难于实现:பைடு நூலகம்务的封锁请求可以随着事务的执行而动
态地决定,很难事先确定每一个事务要封锁哪些对象,
因此也就很难按规定的顺序去施加封锁 维护成本高:DBS中可封锁的数据对象极其众多,并且 随数据的插入、删除等操作而不断地变化,要维护这样
极多而且变化的资源封锁顺序非常困难,成本很高
数据库概论
20
2. 死锁的诊断与解除 在OS中广为采用的预防死锁的策略并不很适合DB的特点, DBMS在解决死锁的问题上更普遍采用的方法是诊断并解除死 锁的方法。 死锁的诊断与解除 允许死锁的发生 解除死锁:由DBMS的并发控制子系统定期检测系统中是 否存在死锁,一旦检测到死锁,就要设法解除
数据库概论
9
二、基本封锁类型 一个事务对某个数据对象加锁后究竟拥有什么样的控制是由 封锁的类型决定的。DBMS通常提供了多种类型的封锁。 基本封锁类型
排它锁(eXclusive lock,简记为X锁)
排它锁:又称为写锁。若事务T对数据对象A加上X锁, 则只允许T读取和修改A,其它任何事务都不能再对A加 任何类型的锁,直到T释放A上的锁。这就保证了其它事 务在T释放A上的锁之前不能再读取和修改A。
数据库管理系统必须提供并发控制机制 并发控制机制是衡量一个数据库管理系统性能的重要标志之一
数据库概论
2
§11.1 并发控制概述 并发控制机制的任务 对并发操作进行正确调度
保证事务的隔离性
保证数据库的一致性
数据库概论
3
§11.1并发控制概述
例:考虑飞机订票系统中的一个活动序列:
甲售票点(甲事务)
其中:
T为结点的集合,每个结点表示正运行的事务; U为边的集合,每条边表示事务等待的情况。 在事务之间用有向弧表示事务之间的等待情况 事务等待图动态地反映了所有事务的等待情况
并发控制子系统周期性地(比如每隔1分钟)检测事务等待
图,如果发现图中存在回路,则表示系统中出现了死锁。 T1
数据库概论
发现某些记录神密地消失了。
3.事务2插入了一些记录,当事务1再次按相同条件读取 数据时,发现多了一些记录。
数据库概论
后两种也称 为幻影现象
7
问题产生原因及解决技术 产生上述三类数据不一致性的主要原因 并发操作破坏了事务的隔离性 并发控制就是要用正确的方式调度并发操作,使一个用户事
务的执行不受其它事务的干扰,从而避免造成数据的不一致性
N
T2
T1
S N Y Y
Y
X S -
N Y
Y Y
Y=Yes,相容的请求 N=No,不相容的请求
数据库概论
12
§11.3 活锁和死锁 封锁技术可以有效地解决并行操作的一致性问题,但
也带来一些新的问题
死锁
活锁
数据库概论
13
§11.3.1 活锁
如果事务T1封锁
了数据R,事务T2 又请求封锁R,于 是T2等待。T3也请 求封锁R,当T1释 放了R上的封之后 系统首先批准了T3 的请求,T2仍然等 待。然后T4又请求 封锁R,当T3释放 了R上的封锁之后 系统又批准了T4的 请求,...,T2有 可能永远等待,这 就是活锁的情形
诊断方法:
超时法 事务等待图法
数据库概论
21
(1)检测死锁:超时法 如果一个事务的等待时间超过了规定的时限,就认为发生
了死锁
优点:实现简单 缺点
有可能误判死锁 时限若设臵得太长,死锁发生后不能及时发现
数据库概论
22
(2)检测死锁:事务等待图法 事务等待图是一个有向图G=(T,U)
请求SL C 等待 等待 等待 等待 等待
(3) ROLLBACK (C恢复为100) Unlock C
没有丢失修改
获得XL B 读B=100 B B× 2 写回 B=200 Commit Unlock B
(4)
获得SL C 读C=100 Unlock C
不再读“脏”数据
数据库概论
可重复读
11
三、锁的相容矩阵 X
数据库概论
5
1. 丢失修改
丢失修改是指事务 1 与事务 2 从数据库中读入同一数据并修 改,事务2的提交结果破坏了事务1提交的结果,导致事务1的 修改被丢失。
2. 读“脏”数据 事务 1 修改某一数据,并将其写回磁盘,当事务 2 读取同一
数据后,事务 1 由于某种原因被撤消,这时事务 1将已修改过
T1
(1)SL A=50 SL B=100 读A,B 求和A+B=150 (2)
T2
T1
(1)XL C 读C=100 CC×2 写回C=200
T2
(3)AA-1 写回A=15 Commit Unlock A (4)
请求XL B 等待 等待 等待
(2)
(3) 读A=50,B=100 求和A+B=150 Commit Unlock A Unlock B (4)
丢失修改
乙售票点(乙事务)
Read某航班的机票余额A, A=16. Read同一航班的机票余额A, A=16. A←A-1. Write: A=15 A←A-1. Write: A=15
甲售票点 (甲事务) 乙售票点 (乙事务)
不可重复读
甲售票点 (甲事务) 乙售票点 (乙事务)
Read:A=16. Read:B=16 A+B=32 Read:B=16. B←B*2 Write:B=32 Read:A=16. Read:B=32 A+B=48 (验算不对)
这样就出现了 T1 在等待 T2 ,而 T2
又在等待 T1 的局面, T1 和 T2 两个 事务永远不能结束,形成死锁。
数据库概论
16
产生死锁的原因 在数据库中,产生死锁的原因 是两个或多个事务都已封锁了一些数据对象,然后又都请
求对已为其他事务封锁的数据对象加锁,从而出现死等待。
数据库概论
17
数据库概论
14
如何避免活锁 避免活锁简单方法是采用先来先服务的策略 当多个事务请求封锁同一数据对象时 按请求封锁的先后次序对这些事务排队 该数据对象上的锁一旦释放,首先批准申请队列中第
一个事务获得锁。
数据库概论
15
§11.3.2 死锁 如果事务T1封锁了数据R1,
T1 Xlock R1 . . . Xlock R2 等待 等待 等待 .
t4 t5 t6 t7 t8
写回A(=3) Unlock A
(a)串行调度(1) 数据库概论
(b)串行调度(2)
26
事务的并行调度
事务 T1 Slock B Y=B=2 Slock A T2
时序列
数据库概论
(c) 不 可 串 行 化 的 调 度
t1 t2 t3 t4 t5 t6 t7 t8
X=A=2
T2
23
2. 死锁的诊断与解除 解除死锁 选择一个处理死锁代价最小的事务,将其撤消,释放此 事务持有的所有的锁,使其它事务能继续运行下去。并且
对撤消的事务所执行的数据修改操作必须加以恢复。
数据库概论
24
§11.4 并发调度的可串行性 几个概念 (1)调度: 事务的执行顺序称为一个调度,表示事务的指令在系统 中执行的时间顺序 (2)串行调度
Unlock B Unlock A Xlock A A=Y+1写回A(=3) Xlock B B=X+1写回B(=3) Unlock A Unlock B
27
事务的并行调度
事务 时序列 t1 Slock B Y=B=2 t2 t3 t4 t5 t6 t7 t8 Unlock B Xlock A Slock A A=Y+1写回A(=3) Unlock A 等待 等待 X=A=3 Unlock A Xlock B B=X+1写回B(=4) Unlock B T1 T2
的数据恢复原值。事务2读到的数据就与数据库中的数据不一 致,是不正确的数据,又称为“脏”数据。
数据库概论
6
3. 不可重复读 不可重复读 指事务 1 读取数据后,事务 2 执行更新操作,使事务 1 无 法再现前一次读取结果。 不可重复读包括三种情况: 事务1读取某一数据后: 1.事务2对其做了修改,当事务1再次读该数据时,得到 与前一次不同的值。 2.事务2删除了其中部分记录,当事务1再次读取数据时,
数据库概论
25
事务的串行调度
事务 时序列 T1 T2 T1 T2
t1
t2 t3
Slock B
Y=B=2 Unlock B Xlock A
Slock A
X=A=2 Unlock A Xlock B
A=Y+1
B=X+1
写回B(=3) Unlock B Slock A X=A=3 Unlock A Xlock B B=X+1写回B(=4) Unlock B Slock B Y=B=3 Unlock B Xlock A A=Y+1写回A(=4) Unlock A
解决死锁的方法 两类方法
1. 预防死锁
2. 死锁的诊断与解除
1. 死锁的预防
产生死锁的原因:是两个或多个事务都已封锁了一些数据
对象,然后又都请求对已为其他事务封锁的数据对象加锁, 从而出现死等待
预防死锁的发生就是要破坏产生死锁的条件
预防死锁通常有两种方法:
一次封锁法
顺序封锁法
数据库概论
并发控制的主要技术是封锁(Locking)
数据库概论
8
§11.2 封锁
一、什么是封锁 封锁
就是事务T在对某个数据对象(例如表、记录等)操作
之前,先向系统发出请求,对其加锁 加锁后事务T就对该数据对象有了一定的控制,在事务T释 放它的锁之前,其它的事务不能更新此数据对象。 封锁是实现并发控制的一个非常重要的技术