数据库原理与应用 第8章 事务与并发控制

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
❖若:突然断电,转账活动的完成情况如 何?
事务可以保证在一个事务中的全部操作或 者全部成功,或者全部失败。
8.1.1 事务的基本概念
❖事务是用户定义的数据操作系列,这些 操作作为一个完整的工作单元,一个事 务内的所有语句被作为一个整体,要么 全部执行,要么全部不执行。
❖例如:对于一个转帐活动:A帐户转帐给 B帐户n元钱,这个活动包含两个动作:
❖若并发事务的一个调度是可串行化的, 不一定所有事务都符合两段锁协议。
调度示例















❖对于读操作(检索),可以多个事务同 时获得共享锁,但阻止其它事务对已获得 共享锁的数据进行排它封锁。
排他锁
❖简记为X锁 :若事务T给数据对象A加了X 锁,则允许T读取和修改A,但不允许其他 事务再给A加任何类型的锁和进行任何操 作。
❖一旦一个事务获得了对某一数据的排他 锁,则任何其他事务均不能对该数据进行 任何封锁,其他事务只能进入等待状态, 直到第一个事务撤销了对该数据的封锁。
则都是正确的结果。
策略1:串行调度
策略2:并行调度









8.2.6 两段锁协议
❖将所有的事务分为两个阶段对数据进行 加锁和解锁:
▪ 在对任何数据进行读写操作之前,首先要获 得对该数据的封锁。
▪ 在释放一个封锁之后,事务不再申请和获得 任何其他封锁。
❖两段锁协议是实现可串行化调度的充分 条件。
BEGIN TRANSACTION | TRAN
❖事务的结束标记为:
COMMIT [TRANSACTION|TRAN] ROLLBACK [TRANSACTION|TRAN]
示例
BEGIN TRANSACTION
UPDATE 支付表 SET 帐户总额 = 帐户总额 - n WHERE 帐户名 = ‘A’
死锁的诊断——等待图法
❖ 是一个有向图G=(T,U)。T为结点的集合,每个结 点表示正在运行的事务;U为边的集合,每条边表
示事务等待的情况。若T1等待T2,则T1和T2之间 划一条有向边,从T1指向T2, ❖ 并发控制子系统周期性地(比如每隔几秒)生成 事务的等待图,并进行检测。如果发现图中存在 回路,则表示系统中出现了死锁。
能够减少处理机的空闲时间, 提高系统的效率。
不同的多事务执行方式
❖同时并发方式
▪ 多处理机系统中,每个处理机可以运 行一个事务,
▪ 多个处理机可以同时运行多个事务, 实现多个事务真正的并行运行。
❖这里讨论单处理机环境下的并发控 制技术。
并发事务的相互干扰示例
❖ A、B两个订票点恰巧同时办理同一架航班的飞机 订票业务。设其操作过程及顺序如下:
❖并发控制的主要技术——加锁(Locking) ❖加锁就是事务T在对某个数据操作之前,
先向系统发出请求,封锁其所要使用的 数据。在事务T释放它的锁之前,其他 事务不能操作这些数据。 ❖锁的类型:共享锁、排他锁
共享锁
❖简记为S锁:若事务T给数据对象A加了S 锁,则事务T可以读A,但不能修改A,其 他事务可以再给A加S锁,但不能加X锁, 直到T释放了A上的S锁为止。
❖可串行性是并发事务正确性的准则, 按这个准则,一个给定的并发调度, 当且仅当它是可串行化的时,才认为 是正确的调度。
可串行化调度
例:设有两个事务,分别包含下列操作:
▪ 事务T1:读B;A=B+1;写回A ▪ 事务T2:读A;B=A+1;写回B
设A、B的初值均为4,
❖按T1 T2顺序执行,结果:A=5,B=6; ❖按T2 T1顺序执行,结果:A=6,B=5。 ❖当并发调度时,如果执行的结果是这两者之一,
UPDATE 支付表 SET 帐户总额 = 帐户总额 + n WHERE 帐户名 = ‘B’
COMMIT
❖对于订票系统:
❖若多个用户同时订票,会产生什么问题 ?
8.2.1 并发控制概述
❖数据库中的数据是一个共享的资源,因此 会有很多用户同时使用数据库中的数据,
❖在多用户系统中,可能同时运行着多个事 务,而事务的运行需要时间,并且事务中的 操作是在一定的数据上进行的。
❖ 隔离性(Isolation) :指数据库中一个事务的执 行不能被其它事务干扰。
❖ 持久性( Durability ) :也称为永久性。指事务 一旦提交,其对数据库数据的改变就是永久的。
❖保证事务的ACID特性是事务处理的重要 任务。
❖事务的ACID特性可能遭到破坏的因素有:
▪ 多个事务并行运行时,不同事务的操 作有交叉情况;
锁的相容矩阵
8.2.3 封锁协议
❖在运用X锁和S锁对数据对象进行加锁时, 还需要约定一些规则,如何时申请X锁或 S锁、持锁时间、何时释放锁等。
❖称这些规则为封锁协议或加锁协议。 ❖对封锁方式规定不同的规则,就形成了
各种不同级别的封锁协议。 ❖不同级别的封锁协议达到的系统一致性
级别不同。
一级封锁协议
❖当系统中同时有多个事务在运行时,特别 是当这些事务是对同一段数据进行操作时, 彼此之间就有可能产生相互干扰的情况。
❖如:订票、银行
8.2 并发控制
❖8.2.1 并发控制概述 ❖8.2.2 并发控制措施 ❖8.2.3 封锁协议 ❖8.2.4 活锁和死锁 ❖8.2.5 并发调度的可串行性 ❖8.2.6 两段锁协议
两段锁协议
❖可以将每个事务分成两个时期:申请封锁 期和释放封锁期,申请期申请要进行的封 锁,释放期释放所占有的封锁。
❖在申请期不允许释放任何锁,在释放期不 允许申请任何锁,这就是两段式封锁。
一些结论
❖事务遵守两段锁协议是可串行化调度 的充分条件,而不是必要条件。
❖若并发事务都遵守两段锁协议,则对 这些事务的任何并发调度策略都是可 串行化的。
▪ 第一个动作:A帐户 - n ▪ 第二个动作:B帐户 + n
说明
❖假设第一个操作成功了,第二个操作由于某 种原因没有成功,在系统恢复正常后,A账 户的金额应是多少?
❖如果B账户的金额没有变化,则正确的情况 是A账户的金额也应该没有变化。
❖怎样保证在系统恢复之后,A账户中的金额 没有减少?这就要用到事务的概念。
死锁的解除
❖通常采用的方法是选择一个处理死锁代 价最小的事务,将其撤销,释放此事务 所持有的全部锁,使其他事务可以继续 运行下去。
❖而且,对撤销事务所执行的数据修改操 作必须加以恢复。
8.2.5 并发调度的可串行性
❖多个事务的并发执行是正确的,当且 仅当其结果与按某一顺序的串行执行 的结果相同,则我们称这种调度为可 串行化的调度。
死锁的诊断——超时法
❖超时法。如果一个事务的等待时间超过 了规定的时限,则认为发生了死锁。
❖优点是实现起来比较简单, ❖缺点是可能产生误判的情况:
▪ 如果事务因某些原因造成等待时间比较 长,超过了规定的等待时限,则系统会 误认为发生了死锁。
▪ 若时限设置的比较长,则不能对发生的 死锁进行及时的处理。
些数据记录后,事务T2删除了其中的部分记 录,或者在其中添加了部分记录,则当T1再 次按相同条件读取数据时,发现其中莫名其 妙地少了(对删除)或多了(对插入)一些 记录。
❖这样的数据对T1来说就是“幽灵”数据或称 “幻影”数据。
8.2.2 并发控制措施
❖控制目标:事务运行过程中尽可能隔离 事务外操作对本事务数据环境的影响。
❖对事务T要修改的数据加X锁,直到事 务结束(包括正常结束和非正常结束) 时才释放。
❖一级封锁协议可以防止丢失修改,并 保证事务T是可恢复的
❖但不能保证可重复读和不读“脏”数 据。
一级封锁协议示例
没 有 丢 失 修 改
二级封锁协议
❖一级封锁协议加上对事务T对要读取 的数据加S锁,读完后即释放S锁。
❖会产生多个事务同时存取同一数据的情 况。
❖可能会存取和存储不正确的数据,破坏 事务一致性和数据库的一致性。
❖并发控制是衡量DBMS性能的重要标志之 一。
并发操作带来的数据不一致性
❖丢失修改 ❖读“脏”数据 ❖不可重复读 ❖产生“幽灵”数据
丢失修改
读“脏”数据
不可重复读
产生“幽灵”数据
❖属于不可重复读的范畴。 ❖指当事务T1按一定条件从数据库中读取了某
❖除了可以防止丢失修改外,还可以防 止读“脏”数据。
❖但不能保证可重复读数据。
二级封锁协议示例
没 有 读 脏 数 据
三级封锁协议
❖一级封锁协议加上事务T对要读取的 数据加S锁,并直到事务结束才释放。
❖除了可以防止丢失修改和不读“脏” 数据之外,还进一步防止了不可重 复读。
三级封锁协议示例
可 重 复 读
❖事务可以保证在一个事务中的全部操作或者 全部成功,或者全部失败。
8.1.2 事务的特征
❖ 原子性(Atomicity) :指事务是数据库的逻辑工 作单位,事务中的操作要么都做,要么都不做。
❖ 一致性(Consistency) :指事务执行的结果必须 是使数据库从一个一致性状态变到另一个一致性状 态。
不同的多事务执行方式
❖串行执行
▪ 每个时刻只有一个事务运行,
其他事务必须等到这个事务
T1
结束以后方能运行。
▪ 问题:不能充分利用系统资
T2
源,发挥数据库共享资源的
特点。
T3
不同的多事务执行方式
❖交叉并行执行
T1
T2 T3ຫໍສະໝຸດ Baidu
▪ 在单处理机系统中,事务的
并行执行是这些并行事务的
并行操作轮流交叉运行。
▪ 单处理机系统中的并行事务 并没有真正地并行运行,但
预防死锁的方法
❖ 一次封锁法:每个事务一次将所使用数据全部加锁。
▪ 存在的问题 • 降低系统并发度 • 难于事先精确确定封锁对象
❖ 顺序封锁法:预先对数据对象规定一个封锁顺序,所 有事务都按这个顺序封锁。
▪ 存在的问题 • 维护成本:数据库系统中封锁的数据对象极多,并且在 不断地变化。 • 难以实现:很难事先确定每一个事务要封锁哪些对象。
不同级别的封锁协议总结
8.2.4 活锁和死锁
❖并发控制的封锁方法可能会引起活锁和 死锁等问题。
❖活锁
避免活锁
❖简单方法是采用先来先服务的策略。 ❖当多个事务请求封锁同一数据对象时,
数据库管理系统按先请求先满足的事 务排队策略,当数据对象上的锁被释 放后,让事务队列中第一个事务获得 锁。
死锁
❖两个事务相互等待对方先释放资源,则会 造成死锁。
▪ 事务在运行过程中被强迫停止。
8.1.3 事务处理模型
❖隐式事务:隐式事务是每一条数据操 作语句都自动地成为一个事务。
❖显式事务:有显式的开始和结束标记 的事务。 ▪ ISO事务处理模型 ▪ T-SQL事务处理模型(SQL Server采用)
T-SQL事务处理模型
❖每个事务都有显式的开始和结束标记。 ❖事务的开始标记是:
▪ A订票点(事务A)读出航班目前的机票余额数,假 设为10张;
▪ B订票点(事务B)读出航班目前的机票余额数,也 为为10张;
▪ A订票点订出6张机票,修改机票余额为10-6=4,并 将4写回到数据库中;
▪ B订票点订出5张机票,修改机票余额为10-5=5,并 将5写回到数据库中;
事务并发执行带来的问题
数据库原理与应用教程 (第2版)
第8章 事务与并发控制
❖8.1 事务
▪ 8.1.1 事务的基本概念 ▪ 8.1.2 事务的特征 ▪ 8.1.3 事务处理模型
❖8.2 并发控制
❖例如:对于一个转帐活动:A帐户转帐给B 帐户n元钱,这个活动包含两个动作:
▪ 第一个动作:A帐户 - n ▪ 第二个动作:B帐户 + n
相关文档
最新文档