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