第十八章并发控制第十八章并发控制并发控制概述多事务执行方式(1)事务串行执行每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。不能充分利用系统资源,发挥数据库共享资源的特点。(2)交叉并发方式(interleavedconcurrency)事务的并行执行是这些并行事务的并行操作轮流交叉运行。是单处理机系统中的并发方式,能够减少处理机的空闲时间,提高系统的效率。(3)同时并发方式(simultaneousconcurrency)多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行。事务并发执行带来的问题事务并发可能会存取和存储不正确的数据,破坏事务的隔离性和数据库的一致性。所以DBMS必须提供并发控制机制,并发控制机制是衡量一个DBMS性能的重要标志之一。18.1并发控制概述并发控制机制的任务■对并发操作进行正确调度■保证事务的隔离性■保证数据库的一致性数据不一致实例:飞机订票系统事务T事务T,①读A=162读A=16③ A+A-1写回A=15④A+A-1写回A=15并发操作带来的数据不一致性1.丢失修改丢失修改是指事务1与事务2从数据库中读入同一数据并修改事务2的提交结果破坏了事务1提交的结果,导致事务1的修改被丢失
第十八章 并发控制 读A=16 A←A-1 写回A=15 ① 读A=16 ② ③ A←A-1 写回A=15 ④ 事务 T1 事务 T2 读A=16 A←A-1 写回A=15 ① 读A=16 ② ③ A←A-1 写回A=15 ④ 事务 T1 事务 T2 第十八章 并发控制 并发控制概述 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。不能充分利 用系统资源,发挥数据库共享资源的特点。 (2)交叉并发方式(interleaved concurrency) 事务的并行执行是这些并行事务的并行操作轮流交叉运行。是单处理机系统中的并发方式, 能够减少处理机的空闲时间,提高系统的效率。 (3)同时并发方式(simultaneous concurrency) 多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实 现多个事务真正的并行运行。 事务并发执行带来的问题 事务并发可能会存取和存储不正确的数据,破坏事务的隔离性和数据库的一致性。所以 DBMS 必须提供并发控制机制,并发控制机制是衡量一个 DBMS 性能的重要标志之一。 18.1 并发控制概述 并发控制机制的任务 ◼ 对并发操作进行正确调度 ◼ 保证事务的隔离性 ◼ 保证数据库的一致性 数据不一致实例:飞机订票系统 并发操作带来的数据不一致性 1. 丢失修改 丢失修改是指事务 1 与事务 2 从数据库中读 入同一数据并修改 事务 2 的提交结果破坏了事务 1 提交的结果, 导致事务 1 的修改被丢失
第十八章并发控制TT2①读A=16②读A=16 A-A-1写回A=15AA-1④写回A=15(a)丢失修改2.不可重复读不可重复读是指事务1读取数据后,事务2执行更新操作,使事务1无法再现前一次读取结果。三类不可重复读事务1读取某一数据后:1.事务2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。2.事务2删除了其中部分记录,当事务1再次读取数据时,发现某些记录神密地消失了。3.事务2插入了一些记录,当事务1再次按相同条件读取数据时,发现多了一些记录。后两种不可重复读有时也称为幻影现象(phantomrow)T,T2①读A=50读B=100求和=150②读B=100B←B*2写回B=200③读A=50读B=200求和=250(验算不对)(b) 不可重复读
第十八章 并发控制 读A=16 A←A-1 写回A=15 ① 读A=16 ② ③ A←A-1 写回 A=15 ④ T1 T2 读A=16 A←A-1 写回A=15 ① 读A=16 ② ③ A←A-1 写回 A=15 ④ T1 T2 (a) 丢失修改 读B=100 B←B*2 写回B=200 ① 读A=50 读B=100 求和=150 ② ③ 读A=50 读B=200 求和=250 (验算不对) T1 T2 读B=100 B←B*2 写回B=200 ① 读A=50 读B=100 求和=150 ② ③ 读A=50 读B=200 求和=250 (验算不对) T1 T2 (b) 不可重复读 2. 不可重复读 不可重复读是指事务 1 读取数据后,事务 2 执行更新操作,使事务 1 无法再现前一次读 取结果。 三类不可重复读 事务 1 读取某一数据后: 1. 事务 2 对其做了修改,当事务 1 再次读该数据时,得到与前一次不同的值。 2. 事务 2 删除了其中部分记录,当事务 1 再次读取数据时,发现某些记录神密地消失了。 3. 事务 2 插入了一些记录,当事务 1 再次按相同条件读取数据时,发现多了一些记录。 后两种不可重复读有时也称为幻影现象(phantom row)
第十八章并发控制3.读“脏"数据事务1修改某一数据,并将其写回磁盘事务2读取同一数据后事务1由于某种原因被撤消,这时事务1已修改过的数据恢复原值事务2读到的数据就与数据库中的数据不一致,是不正确的数据,又称为“脏"数据。TiT2①读C=100C+C*2写回C②读C=200③ROLLBACKC恢复为100(c)读“脏"数据18.2封锁什么是封锁一、封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术二、基本封锁类型基本封锁类型-排它锁(Exclusivelock,简记为X锁)排它锁又称为写锁。若事务T对数据对象A加上X锁,则允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。共享锁(Sharelock,简记为S锁)共享锁又称为读锁。若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。三、锁的相容矩阵sxTT2xNNYsNYYY=Yes,相容的请求YYYN-No,不相容的请求
第十八章 并发控制 读C=200 ① 读C=100 C←C*2 写回C ② ③ ROLLBACK C恢复为100 T1 T2 读C=200 ① 读C=100 C←C*2 写回C ② ③ ROLLBACK C恢复为100 T1 T2 (c) 读“脏”数据 Y=Yes,相容的请求 N=No,不相容的请求 T1 T2 X S - X N N Y S N Y Y - Y Y Y Y=Yes,相容的请求 N=No,不相容的请求 T1 T2 X S - X N N Y S N Y Y - Y Y Y X S - X N N Y S N Y Y - Y Y Y X S - X N N Y S N Y Y - Y Y Y 3. 读“脏”数据 事务 1 修改某一数据,并将其写回磁盘 事务 2 读取同一数据后 事务 1 由于某种原因被撤消,这时事务 1 已修改过 的数据恢复原值 事务 2 读到的数据就与数据库中的数据不一致, 是不正确的数据,又称为“脏”数据。 18.2 封锁 一、什么是封锁 封锁就是事务 T 在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对 其加锁。加锁后事务 T 就对该数据对象有了一定的控制,在事务 T 释放它的锁之前,其它的事 务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术 二、基本封锁类型 基本封锁类型 ◼ 排它锁(Exclusive lock,简记为 X 锁) 排它锁又称为写锁。若事务 T 对数据对象 A 加上 X 锁,则允许 T 读取和修改 A, 其它任何事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁。 ◼ 共享锁(Share lock,简记为 S 锁) 共享锁又称为读锁。若事务 T 对数据对象 A 加上 S 锁,则其它事务只能再对 A 加 S 锁,而不能加 X 锁,直到 T 释放 A 上的 S 锁。 三、锁的相容矩阵
第十八章并发控制封锁协议18.3在运用X锁和S锁对数据对象加锁时,需要约定一些规则:封锁协议(LockingProtocol)■何时申请X锁或S锁■持锁时间、何时释放不同的封锁协议,在不同的程度上为并发操作的正确调度提供一定的保证。常用的封锁协议:三级封锁协议1级封锁协议事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。1级封锁协议可防止丢失修改。在1级封锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读“脏”数据。2级封锁协议1级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可释放S锁。2级封锁协议可以防止丢失修改和读“脏"数据。在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。3级封锁协议1级封锁协议+事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放3级封锁协议可防止丢失修改、读脏数据和不可重复读。4.封锁协议小结三级协议的主要区别1什么操作需要申请封锁■何时释放锁(即持锁时间)X锁s锁致性保证操作结操作结事务结可重事务结不丢失不读肥18.4活锁和死锁修改数据复读束释放束释放束释放束释放封4N1级封锁办议锁/4A2级封锁办议技术1N4J43级封锁办议可以有效地解决并行操作的一致性问题,但也带来一些新的问题死锁■活锁活锁18.4.1T1T2T3T.lockR.-lockR.等待LockR等待LockRUnlock等待等待LockR等待等待等待等待Unlock等待LockR等待
第十八章 并发控制 18.3 封锁协议 在运用 X 锁和 S 锁对数据对象加锁时,需要约定一些规则:封锁协议(Locking Protocol) ◼ 何时申请 X 锁或 S 锁 ◼ 持锁时间、何时释放 不同的封锁协议,在不同的程度上为并发操作的正确调度提供一定的保证。 常用的封锁协议:三级封锁协议 1 级封锁协议 事务 T 在修改数据 R 之前必须先对其加 X 锁,直到事务结束才释放。 1 级封锁协议可防止丢失修改。在 1 级封锁协议中,如果是读数据,不需要加锁的,所以它 不能保证可重复读和不读“脏”数据。 2 级封锁协议 1 级封锁协议+事务 T 在读取数据 R 前必须先加 S 锁,读完后即可释放 S 锁。 2 级封锁协议可以防止丢失修改和读“脏”数据。在 2 级封锁协议中,由于读完数据后即可释 放 S 锁,所以它不能保证可重复读。 3 级封锁协议 1 级封锁协议 + 事务 T 在读取数据 R 之前必须先对其加 S 锁,直到事务结束才释放 3 级封锁协议可防止丢失修改、读脏数据和不可重复读。 4.封锁协议小结 三级协议的主要区别 ◼ 什么操作需要申请封锁 ◼ 何时释放锁(即持锁时间) 18.4 活 锁 和 死锁 封 锁 技 术 可 以有效地解决并行操作的一致性问题,但也带来一些新的问题 ◼ 死锁 ◼ 活锁 18.4.1 活锁
第十八章并发控制如何避免活锁采用先来先服务的策略:当多个事务请求封锁同一数据对象时按请求封锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。18.4.2死锁XlockR.Xlock R2..XlockR2等待Xlock R,等待等待等待等待解决死锁的方法两类方法1.预防死锁产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。预防死锁的发生就是要破坏产生死锁的条件。预防死锁的方法■一次封锁法■顺序封锁法(1)一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行■一次封锁法存在的问题:降低并发度扩大封锁范围,将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度。■难于事先精确确定封锁对象数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象解决方法:将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发度。(2)顺序封锁法顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。顺序封锁法存在的问题-维护成本高:数据库系统中可封锁的数据对象极其众多,并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高■难于实现:事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。例:规定数据对象的封锁顺序为A,B,C,D,E。事务T起初要求封锁数据对象B,C,E,但当它封锁厂B.C后,才发现还需要封锁A,这样就破环封锁顺序结论:在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点,DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法
第十八章 并发控制 Xlock R1 . . . Xlock R2 等待 等待 等待 . . . Xlock R2 . . Xlock R1 等待 等待 . 如何避免活锁 采用先来先服务的策略: 当多个事务请求封锁同一数据对象时 按请求封锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列 中第一个事务获得锁。 18.4.2 死锁 解决死锁的方法 两类方法 1. 预防死锁 产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事 务封锁的数据对象加锁,从而出现死等待。预防死锁的发生就是要破坏产生死锁的条件。 预防死锁的方法 ◼ 一次封锁法 ◼ 顺序封锁法 (1)一次封锁法 要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行 ◼ 一次封锁法存在的问题:降低并发度 扩大封锁范围,将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系 统的并发度。 ◼ 难于事先精确确定封锁对象 数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封 锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象 解决方法:将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发 度。 (2)顺序封锁法 顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。 顺序封锁法存在的问题 ◼ 维护成本高:数据库系统中可封锁的数据对象极其众多,并且随数据的插入、 删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困 难,成本很高 ◼ 难于实现:事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定 每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。 例:规定数据对象的封锁顺序为 A,B,C,D,E。事务 T 起初要求封锁数据对象 B,C,E,但当它 封锁了 B,C 后,才发现还需要封锁 A,这样就破坏了封锁顺序. 结论:在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点,DBMS 在解决 死锁的问题上更普遍采用的是诊断并解除死锁的方法