第十一章 并发控制概要
第十一章并发控制技术
第十一章并发控制11.1 并发控制概述 (1)11.2 封锁(Locking) (3)11.3 封锁协议 (4)11.5 并发调度的可串行性 (8)11.6 两段锁协议 (9)11.7 封锁的粒度 (11)11.7.2意向锁 (12)数据库是一个共享资源,可以供多个用户使用。
允许多个用户同时使用的数据库系统称为多用户数据库系统。
例如飞机定票数据库系统、银行数据库系统等都是多用户数据库系统。
在这样的系统中,在同一时刻并行运行的事务数可达数百个。
交叉并发方式: 在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行。
同时并行运行: 在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行个事务,实现多个事务真正的并行运行。
这种并行执行方式称为同时并发方式(Simultaneous Concurrency)。
本章讨论的数据库系统并发控制技术是以单处理机系统为基础的。
这些理论可以推广到多处理机的情况。
当多个用户并发地存取数据时就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。
所以数据库管理系统必须提供并发控制机制。
并发控制机制是衡量一个数据库管理体制系统性能的重要标志之一11.1 并发控制概述下面先来看一个例子,说明并发操作带来的数据的不一致性问题。
考虑飞机订票系统中的一个活动序列:①甲售票点(甲事务)读出某航班的机票余额A,设A=16;②乙售票点(乙事务)读出同一航班的机票余额A,也为16;③甲售票点卖出一张机票,修改余额A←A-1,所以A为15,把A写回数据库;④乙售票点也卖出一张机票,修改余额A←A-1,所以A为15,把A写回数据库。
并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏”数据,图11.1三种数据不致性1.丢失修改(Lost Update)上面飞机订票例子就属此类。
2.不可重复读(Non-Repeatable Read)不可重复读是指事务T读取数据后,事务T执行更新操作,使T无法再现前一次读取结果。
11并发控制-文档资料
11.1 事务的基本概念
定义 是用户定义的一个数据库操作序列,这些操作要么全做要么 全不做,是一个不可分割的工作单位 事务和程序比较
在关系数据库中,一个事务可以是一条或多条SQL语句,也
可以包含一个或多个程序。一个程序通常包含多个事务
SQL Server 中事务分类
(1)系统事务:一条语句就是一个事务 (2)用户定义事务:
并行操作:在单处理机系统中,事务的并行执行 实际上是这些并行事务的操作轮流交叉进行。
并发操作举例
考虑飞机订票系统。设有两个订票点,机票余票 A=15。
甲售票点
取A=15 修改A=A-1
乙售票点
取A=15 修改A=A-1
写回数据库A=14
写回数据库A=14
T
结果明明卖出两张机票,数据库中机票余额只减少1
并发操作带来的数据不一致性
丢失修改(Lost Update) 不可重复读(Non-repeatable Read)
读“脏”数据(Dirty Read)
记号
R(x):读数据x W(x):写数据x
1. 丢失修改
两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1
提交的结果,导致T1的修改被丢失。
T1 ① R(A)=15 T2
②
③ A←A-1 W(A)=14 ④
R(A)=15
A←A-1 W(A)=14
丢失修改
2. 不可重复读
不可重复读是指事务 T1读取数据后,事务T2 执行更新操作,使T1无
法再现前一次读取结果。 T1 ① R(A)=50 R(B)=100 求和=150 ② R(B)=100 T2
事务的ACID特性: 原子性(Atomicity)
数据库原理之并发控制
数据库原理之并发控制并发控制是数据库管理系统中非常重要的一部分,它涉及到同时对数据库进行读写操作时的问题。
并发控制的目标是确保数据的一致性和可靠性,同时提高系统的性能和吞吐量。
在数据库中,同时进行读写操作可能导致以下问题:丢失修改、脏读、不可重复读和幻读。
并发控制的目标是解决这些问题,确保多个事务同时对数据库进行操作时,数据的一致性仍能得到保障。
为了达到并发控制的目标,数据库管理系统通常使用锁和事务的概念。
锁是数据库管理系统提供的一种机制,用于保护数据不被并发访问时产生的问题。
常见的锁有共享锁和排它锁。
共享锁允许多个事务同时读取数据,但阻止其他事务对数据进行修改。
排它锁禁止其他事务对数据进行读取和修改。
事务是一组数据库操作的逻辑单元,它将多个操作捆绑在一起,以确保它们能够作为一个原子操作运行。
事务具有四个属性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
并发控制主要关注隔离性这个属性。
数据库管理系统会使用不同的并发控制技术来保证事务的隔离性。
其中最常见的技术是两阶段锁协议和多版本并发控制(MVCC)。
两阶段锁协议分为两个阶段:加锁阶段和解锁阶段。
在加锁阶段,事务申请和获得需要的锁,确保操作的原子性。
在解锁阶段,事务释放已经持有的锁,为其他事务提供机会。
多版本并发控制(MVCC)是一种基于时间戳的并发控制技术。
每个事务在开始时会被分配一个唯一的时间戳,用于标识事务的顺序。
数据库中的每个数据项都有一个或多个版本,每个版本都有一个时间戳,用于标识该版本创建的时间。
事务只能读取在其开始之前创建的版本,从而避免了脏读和不可重复读的问题。
除了锁和事务,数据库管理系统还使用了其他的并发控制技术,例如并发控制图(Concurrency Control Graph)、多粒度锁(Multigranularity Locking)和死锁检测和处理。
数据库系统概论并发控制
T1
T2
T1
T2
① Xlock C
获得
读 C=100
C=2*C
写回 C=200
③rollback
②读 C=200
① Xlock C
获得
读C=100
C=2*C
写回 C=200
③ rollback
②Slock C 等待
7
第七页,编辑于星期一:二十点 三十六分。
1.一级封锁协议
一级封锁协议 :事务T在修改数据 R之前必须先对其加 X锁,
直到事务结束才释放 .
事务甲
事务乙
事务甲 事务乙
①读 A=16
②读A=16
③ A=16-1 ④写回 A=15
⑤ A=16-1
时
⑥写回A=15 间
①Xlock A 获得
读 A=16
③ A=16-1 ④写回 A=15
哪些是不正确的 .(设A、B的初值都为 2)
21
第二十一页,编辑于星期一:二十点 三十六分。
T1
Slock B
获得
读 B=2
Unlock B
Xlock A
获得
A=B+1=3 写回 A=3
Unlock A
T2
Slock A 获得 读A=2 Unlock A
Xlock B 获得
B=A+1=3
写回B=3
按某一次序串行地执行它们时的结果相同 ,我们称 这种调度策略为 可串行化 的调度 . 定理 : 一个给定的并发调度 ,当且仅当它是可串行化的 ,才 认为是 正确调度 .
例子 :有两个事务 : T1:读B; A=B+1; 写回A; T2:读A; B=A+1; 写回 B;
操作系统中的并发控制
操作系统中的并发控制随着计算机技术的不断发展,操作系统已成为现代计算机系统中不可或缺的核心组成部分。
在多用户、多任务的环境下,操作系统需要管理和控制资源的分配和调度,以确保系统的高效运行和资源的合理利用。
而其中一个重要的方面就是并发控制。
一、什么是并发控制在操作系统中,所谓并发指的是两个或多个事件在同一时间间隔内同时发生的情况。
而并发控制则是指对多个并发执行的进程或线程进行协调和管理,以避免出现潜在的问题,如资源竞争、死锁等。
二、并发控制的目标并发控制的目标是确保多个进程或线程在并发执行过程中能够正确地共享和访问资源,并且不会发生竞争条件和冲突。
主要包括以下几个方面:1. 互斥访问:确保同一时间内只有一个进程或线程能够访问共享资源,避免数据的不一致性和错误的结果。
2. 死锁避免:通过合理的资源分配和进程调度,防止进程陷入循环等待的状态,造成系统无法正常进行的情况。
3. 同步执行:确保多个进程或线程按照特定的顺序进行执行,避免因执行顺序不确定而导致的问题。
三、并发控制的方法为了实现并发控制,操作系统采用了多种方法和机制,下面介绍其中常见的几种方法。
1. 互斥锁:互斥锁是一种最常见的并发控制机制,通过给共享资源加锁,并在访问资源前先判断锁的状态,以实现临界区的互斥访问。
2. 信号量:信号量是一种用于进程间同步和互斥的机制,通过对共享资源进行计数和操作,实现资源的互斥访问和进程的同步执行。
3. 读写锁:读写锁是一种特殊的互斥锁,允许多个线程同时对共享资源进行读操作,但在有写操作时需要互斥访问。
4. 事件:事件是一种用于线程同步的机制,通过线程之间的信号通知来实现特定操作的协调和同步。
5. 临界区:临界区是一段代码,在多个进程或线程中同时访问时需要进行互斥控制的区域,通过临界区的互斥访问实现并发控制。
四、并发控制的应用并发控制在操作系统中的应用广泛,影响着系统的性能和用户体验。
以下是几个常见的应用场景:1. 数据库管理系统:数据库管理系统需要确保多个用户能够同时对数据库进行读写操作,但又不会导致数据的冲突和不一致。
数据库第11章并发控制PPT演示文稿
36
并发操作的调度(续)
– 对这两个事务的不同调度策略
• 串行执行 – 串行调度策略1 – 串行调度策略2
• 交错执行
– 不可串行化的调度 – 可串行化的调度
37
(a) 串行调度策略,正确的调度
T1
T2
读B=2 A B+1 写回A=3
读A=3 B A+1 写回B=4
– 时标方法 – 乐观方法
45
11 并发控制
11.1 并发控制概述 11.2 并发操作的调度 11.3 封锁 11.4 死锁和活锁 11.5 Oracle的并发控制
46
11.3 封锁
封锁就是事务T在对某个数据对象(例如表、 记录等)操作之前,先向系统发出请求,对其 加锁。加锁后事务T就对该数据对象有了一定 的控制,在事务T释放它的锁之前,其它的事 务不能更新此数据对象。
»在事务运行的过程中发生了某种故 障,事务不能继续执行
»系统将事务中对数据库的所有已完 成的更新操作全部撤消,滚回到事 务开始时的状态
13
事务(续)
事务的ACID特性:
原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持续性(Durability )
14
基本封锁类型
– 排它锁(eXclusive lock,简记为X锁) – 共享锁(Share lock,简记为S锁)
50
封锁类型(续)
排它锁 – 排它锁又称为写锁。 – 若事务T对数据对象A加上X锁,则只允许T
读取和修改A,其它任何事务都不能再对A 加任何类型的锁,直到T释放A上的锁。
51
封锁类型(续)
7
11.1 并发控制概述
数据库系统概论之并发控制
数据库系统概论之并发控制并发控制是数据库系统中一个重要的概念,它指的是同时运行的多个事务之间对共享资源的访问和操作的控制。
在数据库系统中,多个用户可能同时对数据库进行读操作或者写操作,为了保证数据的一致性和完整性,必须要对并发操作进行控制。
并发控制的目标是确保多个事务的执行在数据库系统中能够正确、有序地进行,而不会出现冲突、混乱等问题。
在实现并发控制的过程中,需要解决的主要问题有以下几个方面:1.数据库锁定机制:锁是最常用的控制并发的工具之一、通过对数据进行加锁,可以控制事务对数据的访问,保证了数据的一致性。
常见的锁有共享锁和排他锁,共享锁允许多个事务读取同一份数据,而排他锁只允许一个事务对数据进行修改。
通过合理的使用锁,可以提高并发处理的效率和性能。
2.事务隔离级别:事务隔离级别定义了多个事务之间的隔离程度,即一个事务对数据库所做的修改对其他事务是否可见。
常见的事务隔离级别有READUNCOMMITTED、READCOMMITTED、REPEATABLEREAD和SERIALIZABLE。
不同的隔离级别对并发控制的实现方式和性能有不同的影响。
3.死锁处理:死锁指的是多个事务互相等待对方释放资源,导致无法继续进行下去的情况。
数据库系统需要检测和处理死锁,以保证系统的正常运行。
常见的死锁处理方法有超时、死锁检测和死锁恢复等。
除了以上三个方面,还有其他一些并发控制的技术和策略可以提高系统的并发处理能力,例如多版本并发控制(MVCC)、时间戳、快照隔离等。
这些技术和策略可以根据不同的应用场景和需求来选择和应用。
在实际应用中,合理设计和使用并发控制机制可以提高数据库系统的性能和并发处理能力。
但是,过度的并发控制也可能导致系统性能下降。
因此,在设计数据库系统时,需要综合考虑并发控制的复杂性、性能和系统需求,做出合理的选择和权衡。
总之,并发控制是数据库系统中一个重要的概念,通过对多个事务的并发执行进行控制,保证了数据的一致性和完整性。
并发控制的概念
并发控制的概念并发控制,这听起来像是个有点高深的计算机术语呢。
咱先别急着头疼,就把它想象成一群小动物在抢食物的场景。
比如说,有一群小松鼠,它们都想要那几颗最饱满的松果。
如果没有个规则来管管,那肯定就乱套了,力气大的松鼠可能把所有的松果都抢走,弱小的松鼠就只能饿肚子。
在计算机的世界里呀,并发控制就有点像这个规则。
多个程序或者进程,就好比那些小松鼠,它们可能都想要使用同一种资源,像数据库里的数据。
要是没有并发控制,数据可能就会被搞得乱七八糟。
就像几个厨师同时在一个小厨房里做菜,没有个先来后到的规矩,这个拿盐,那个拿醋,一会儿菜可能就没法吃了,盐放多了,醋倒错了罐子之类的。
我记得有一次我去一个小饭馆吃饭。
那个饭馆很小,只有一个厨师和一个服务员。
那天不巧,来了好几桌客人同时点菜。
服务员把单子一股脑儿都扔给厨师,厨师就有点懵了。
他一会儿做这个菜的一点,一会儿又去弄那个菜的一点。
结果呢,有的菜熟过头了,有的菜还没熟就端上来了。
这就是没有并发控制的下场。
如果服务员能按照一定的顺序,把单子合理地交给厨师,厨师也能按照顺序做菜,那这顿饭肯定就吃得舒舒服服的。
在计算机系统里,并发控制就是要保证这些同时运行的任务,在访问共享资源的时候,不会互相干扰。
数据库里的数据得保持准确、一致。
比如说,一个银行系统,很多人都在同时进行转账操作。
如果没有并发控制,可能一个人的钱转出去了,但是收款人的账户没有收到钱,或者账户余额突然变得乱七八糟。
这就像一群人在搬东西,把东西从一个房间搬到另一个房间。
要是大家乱搬,有的东西可能就丢了,有的可能放错地方了。
并发控制有很多种方法。
就像管理小动物抢食物有不同的办法一样。
有的是给每个进程或者程序安排个顺序,一个一个来,这就好比让小松鼠们排队拿松果。
还有的是给资源加个锁,就像给松果箱子加个锁,只有拿到钥匙的松鼠才能去拿松果。
这样就能保证资源在同一时间只有一个程序或者进程能使用,其他的就只能等着。
并发控制还能提高系统的效率呢。
并发控制(完成)
并发控制 ----两段锁协议
两段锁协议—— 是指所有事务必须分两个阶段对数 据项加锁和解锁: 1. 在对任何数据进行读、写操作之前,首先要 申请并获得对该数据的封锁。 2. 在释放一个封锁之后,事务不再申请和获得 任何其他封锁。
并发控制 ----两段锁协议
“两段”锁的含义: 事务分为两个阶段。 第一阶段——获得封锁,也称为扩展阶段。在这一阶段, 事务可以申请获得任何数据项上的任何类型的锁,但 是不能释放任何锁。
并发控制 ----两段锁协议
遵守两段锁协议的事务发生死锁 T1 T2
Slock B 读B=2 Slock A 读A=2
Xlock A 等待 等待
Xlock B 等待
并发控制 ---封锁的粒度
• • • • 封锁的对象的大小称为封锁粒度(Granularity)。 封锁的对象可以是逻辑单元,也可以是物理单元。 以关系数据库为例,封锁对象可以是: 这样一些逻辑单元: 这样一些物理单元: 属性值、 页(数据页或索引页)、 属性值的集合、 块等 元组、 关系、 索引项、 整个索引 整个数据库;
并发控制 ---封锁的粒度
• 封锁粒度与系统的并发度和并发控制的开销密切相关。 • 直观地看,封锁的粒度越大,数据库所能够封锁的数 据单元就越少,并发度就越小,系统开销也越小;反 之,封锁的粒度越小,并发度较高,但系统开销也就 越大。 • 如果在一个系统中同时支持多种封锁粒度供不同的事 务选择是比较理想的,这种封锁方法称为多粒度封锁 (multiple granularity locking)。
第二阶段——释放封锁,也称为收缩阶段。在这阶段, 事务可以释放任何数据项上的任何类型的琐,但是不 能再申请任何琐。
并发控制 ----两段锁协议
数据库系统原理教程课后习题及答案(第十章)
第11章并发控制1 .在数据库中为什么要并发控制?答:数据库是共享资源,通常有许多个事务同时在运行。
当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。
若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。
所以数据库管理系统必须提供并发控制机制。
2 .并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏’夕数据。
( l )丢失修改(lost update ) 两个事务 Tl 和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了) Tl 提交的结果,导致Tl 的修改被丢失。
( 2 )不可重复读( Non 一 Repeatable Read ) 不可重复读是指事务 Tl 读取数据后,事务几执行更新操作,使 Tl 无法再现前一次读取结果。
( 3 )读“脏”数据( Dirty Read ) 读“脏’夕数据是指事务 Tl 修改某一数据,并将其写回磁盘,事务几读取同一数据后, Tl 由于某种原因被撤销,这时 Tl 已修改过的数据恢复原值,几读到的数据就与数据库中的数据不一致,则几读到的数据就为“脏”数据,即不正确的数据。
避免不一致性的方法和技术就是并发控制。
最常用的技术是封锁技术。
也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。
3 .什么是封锁?基本的封锁类型有几种?试述它们的含义。
答:封锁就是事务 T 在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。
加锁后事务 T 就对该数据对象有了一定的控制,在事务 T 释放它的锁之前,其他的事务不能更新此数据对象。
封锁是实现并发控制的一个非常重要的技术。
基本的封锁类型有两种:排它锁( Exclusive Locks ,简称 x 锁)和共享锁 ( Share Locks,简称 S 锁)。
排它锁又称为写锁。
SQL_TP11_并发控制及并发机制
13
数据库安全控制的一般方法
死锁
如果事务T1和T2都需要数据Rl和R2,操作时Tl封锁了 数据R1,T2封锁了数据R2;然后T1又请求封锁R2,T2又 请求封锁Rl;因T2已封锁了R2,故T1等待T2释放R2上的 锁。同理,因T1已封锁了R1,故T2等待T1释放R1上的锁。 由于Tl和T2都没有获得全部需要的数据,所以它们不会结 束,只能继续等待。这种多事务交错等待的僵持局面称为 死锁。
19
SQL Server中事务的应用
问题:一般来说,银行管理系统都支持同一银行的账号之间转账业务。 以活期储蓄数据库为例,完成从李丹娜的42150002账户转账4000元到张 岚的42180001账户业务。 先建立储户的账号及其余额视图Card_User_V: CREATE VIEW Card_User_V 解决这个问题的有效方法是使用事务。转账是一个事务,两条插 AS 入语句要么都成功执行,涉及的数据修改永久的写入数据库。如果 SELECT dbo.BankUsers.UID AS 用户ID, dbo.BankUsers.Uname AS 姓名, 有一条插入语句不能成功执行,则撤销所涉及的数据更改,使数据 dbo.BankCard.CID AS 账号, dbo.BankCard.Cmoney AS 余额 处于转账前的状态。 FROM dbo.BankCard LEFT OUTER JOIN dbo.BankUsers ON dbo.BankCard.CUID = dbo.BankUsers.UID
16
SQL Server的事务类型
SQL Server的事务3种模式: (1) 显式事务用BEGIN TRANSACTION明确指定事务的开 始,以COMMIT或ROLLBACK明确事务的结束。 (2) 隐式事务:通过设置SET IMPLICIT_TRANSACTIONS ON语句,将隐式事务模式设置为打开。当以隐式事务操作 时,SQL Server将在提交或回滚事务后自动启动新事务。 不扫描事务的开始,只提交或回滚每个事务。 * 触发器是一个隐式事务。 (3) 自动提交事务:这种模式是SQL Server的默认模式。该 模式将每条单独的T-SQL语句是为一个事务。如果语句执 行成功,则自动提交。如果语句执行错误,将自动回滚。
并发控制——精选推荐
并发控制⼀、并发⽅式①交叉并发⽅式:单处理机系统中,事务的并⾏执⾏实际上是这些并⾏事务的并⾏操作轮流交叉进⾏,这种并发执⾏的⽅式称为交叉并发⽅式。
②同时并发⽅式:多处理机系统中,每个处理机运⾏⼀个事务,多个处理机同时运⾏多个事务,实现多个事务真正地并发执⾏,这种并发执⾏⽅式为同时并发⽅式。
⼆、并发控制概述事务是并发控制的基本单位,事务的ACID特性(原⼦性,⼀致性,永久性,隔离性)遭到破坏的原因之⼀是多个事务对统⼀数据的并发操作。
为了保证事务隔离性和⼀致性,DBMS需要对并发操作进⾏正确调度,这也就是并发控制机制的责任。
并发操作带来的数据不⼀致性主要包括:丢失修改,不可重复读,读”脏“数据。
丢失修改:两个事务T1,T2读取同⼀数据并进⾏修改,后提交的事务对数据所做的修改覆盖了先提交的事务对该数据的修改。
不可重复读:事务T1读取某数据后,事务T2对该数据进⾏更新,使得T1⽆法再现前⼀次读取的结果。
主要有三种情况。
①T1读取某⼀数据后,T2对该数据进⾏修改,当T1再次读取该数据时,读取的结果与前⼀次不⼀样。
例如T1读取某数据后进⾏运算并得到结果,T2对该数据进⾏了修改,T1再次读该数据进⾏验算时,验算结果不⼀致。
②T1按⼀定条件读取某些数据记录后,T2删除了其中部分数据,T1再次按相同条件读取时,发现⼀些数据神秘消失。
③T1按⼀定条件读取某些记录后,T2出⼊了⼀些数据,T1再以同样的条件读取数据是,发现多了⼀些记录。
后两种的不可重复读,也叫做”幻影现象“。
读脏数据:T1读取某⼀数据并进⾏修改,将其写回磁盘,T2读取同⼀数据后,T1由于某些原因被撤销,这是T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不⼀致,T2读到的数据就成为”脏“数据。
产⽣以上三类数据不⼀致是由于并发操作破坏了事务的隔离性。
三、并发控制的技术(封锁)并发控制的主要技术有:封锁,时间戳,乐观控制法。
商⽤DBMS通常采⽤封锁⽅法。
chapter11并发控制
⑤
W(A)=14
Commit
Unlock A
2013年7月14日2时53分
T1
T2
11.2 封锁
四、封锁机制—解决不可重复读问题 ----可重复读
事务T1在读A,B之前,先对A,B加S锁
① Slock A Slock B R(A)=50 R(B)=100 求和=150 ② Xlock B 等待
(C恢复为100)
Unlock C ④
等待
等待 获得Slock C R(C)=100 Commit C Unlock C
T1释放C上的X锁后T2获得C上的 S锁,读C=100。避免了T2读 ⑤ “脏”数据
2பைடு நூலகம் 数据库系统概论
2013年7月14日2时53分
第十一章 并发控制
11.1 并发控制概述
13.3.2 死锁 死锁的诊断与解除
死锁的诊断方法 ① 超时法
② 事务等待图法
32
数据库系统概论
11
数据库系统概论
2013年7月14日2时53分
11.1
并发控制概述
并发操作引起的数据不一致问题
不可重复读:两次读的结果不一致
不可重复读是指事务1读取数据后,事务2执行更新操 作,使事务1无法再现前一次读取结果。 事务1读取某一数据后: 1. 事务2对其做了修改,当事务1再次读该数据时,得到 与前一次不同的值。 幻 2. 事务2删除了其中部分记录,当事务1再次读取数据时, 发现某些记录神秘地消失了。 影 现 3. 事务2插入了一些记录,当事务1再次按相同条件读取 数据时,发现多了一些记录。 象
11.3 活锁和死锁
13.3.2 死锁
事务T1封锁了数据R1 T2封锁了数据R2 T1又请求封锁R2,因T2已封 锁了R2,于是T1等待T2释放 R2上的锁 接着T2又申请封锁R1,因T1 已封锁了R1,T2也只能等待 T1释放R1上的锁 这样T1在等待T2,而T2又在 等待T1,T1和T2两个事务永 远不能结束,形成死锁
第十一讲 并发控制技术
两段锁协议(续)
两段锁协议的几种形式:
基本2PL 保守2PL或静态2PL(一次封锁协议) 严格2PL:排他锁必须在事务结束时释放 精确2PL:(三级封锁协议)
遵守两段锁协议的事务可能发生死锁
※ 分析:上述协议对数据不一致问题的解决!!
封锁技术(续)
活锁和死锁问题
封锁技术可以有效地解决并行操作的一致性问题,但也带来一 些新的问题:死锁与活锁
活锁问题的解决方法
采用先来先服务的策略!
死锁问题的两类方法
1. 预防死锁 2. 死锁的诊断与解除
封锁技术(续)
死锁的预防
预防死锁的发生就是要破坏产生死锁的条件。
结果明明卖出两张机票,数据库中机票余额只减少1 !
并发控制概述(续)
并发操作带来的数据不一致性
丢失修改(Lost Update) 不可重复读(Non-repeatable Read) 读“脏”数据(Dirty Read)
记号
R(x): 读数据x W(x): 写数据x
都等于T2的值,X的值都等于T3的值
并发调度的可串行性(续)
视图可串行化调度
※ 视图等价
若S与S’是基于相同数据集的两个不同的调度,若满足下列三个条件, 则称S与S’是视图等价的: 1)对于每个数据项X,若事务Ti在调度S中读取了X的初值,则在S’中Ti也 必须读取X的初值; 2)对于每个数据项X,若事务Ti在调度S中执行了R(X),且读取的X值是由 事务Tj执行W(X)产生的,则在调度S’中,Ti的R(X)操作读取的X值也必须是 由Tj的同一个W(X)产生的; 3)对于每个数据项X,若事务Ti在调度S中执行了最后的W(X)操作,则在 调度S’中Ti也必须执行最后的W(X)操作。
chap11并发控制
一个调度是冲突可串行化,一定是可串行化的调度。
冲突操作
冲突操作是指不同的事务对同一个数据的读写操作和写写操作
Ri (x)与Wj(x)
/* 事务Ti读x,Tj写x*/
Wi(x)与Wj(x)
/* 事务Ti写x,Tj写x*/
其他操作是不冲突操作。
不同事务的冲突操作和同一事务的两个操作不能交换(Swap) ,其它操作 可交换。
❖ 共享锁(Share Locks,简记为S锁):若事务T对数据对象A加上S锁, 则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。
封锁类型的相容矩阵:
绪 论使用封锁机制解决丢失修改问题
T1 ① Xlock A ② R(A)=16
③ A←A-1 W(A)=15 Commit Unlock A
存在的问题:
❖ 降低系统并发度。 ❖ 难于事先精确确定封锁对象。
2.顺序封锁法:即按序分配,是预先对数据对象规定一个封锁顺序,所 有事务都按这个顺序实行封锁。
顺序封锁法存在的问题:
❖ 维护成本:数据库系统中封锁的数据对象极多,并且在不断地变化。 ❖ 难以实现:很难事先确定每一个事务要封锁哪些对象。
结论:
绪 论 11.1 并发控制概述
事务是并发控制的基本单位,保证事务ACID特性是事务处理的重要任务, 而事务ACID特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造 成的。
并发控制机制的任务: ❖ 对并发操作进行正确调度 ❖ 保证事务的隔离性 ❖ 保证数据库的一致性
并发操作带来的数据不一致性包括: 一.丢失修改(Lost Update) 二.不可重复读(Non-Repeatable Read) 三.读脏数据(Dirty Read) 并发控制的主要技术有封锁(Locking)、时间戳(Timestamp)和乐 观控制法。商用的DBMS一般都采用封锁方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不可重复读
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 (验算不对)
如何避免活锁
采用先来先服务的策略: 当多个事务请求封锁同一数据对象时 按请求封锁的先后次序对这些事务排队 该数据对象上的锁一旦释放,首先批准申请 队列中第一个事务获得锁。
11.4.2 死锁
T1 T2 解决死锁的方法
1. 预防死锁 2. 死锁的诊断与解除
Xlock R1 . . . . Xlock R2 . . Xlock R2 . Xlock R1 等待 等待 等待 等待 等待 . .
11.1 并发控制概述
并发控制机制的任务
对并发操作进行正确调度 保证事务的隔离性 保证数据库的一致性
事务 T1 ① 读A=16 ② ③ A←A-1 写回A=15 ④ 事务 T2 读A=16 A←A-3 写回A=13
数据不一致实例:飞机订票系统
T1的修改被T2覆盖了!
并发操作带来的数据不一致性
Slock C 等待 ③ ROLLBACK 等待 (C恢复为100) 等待 Unlock C 等待 ④ 获得Slock C 读C=100 ⑤ Commit C Unlock C
11.4 活锁和死锁
封锁技术可以有效地解决并行操作的一致性问题, 但也带来一些新的问题 死锁 活锁
11.4.1 活锁
三类不可重复读:
事务1读取某一数据后: 1、事务2对其做了修改,当事务1再次读该数据时,得到 与前一次不同的值。 2、事务2删除了其中部分记录,当事务1再次读取数据时, 发现某些记录神密地消失了。 3、事务2插入了一些记录,当事务1再次按相同条件读取 数据时,发现多了一些记录。 后两种不可重复读有时也称为幻影现象
保证并发操作调度正确性的方法
封锁方法:两段锁协议 时标方法 乐观方法
11.6 两段锁协议
两段锁协议的内容 1. 在对任何数据进行读、写操作之前,事务 首先要获得对该数据的封锁 2. 在释放一个封锁之后,事务不再获得任何 其他封锁。
“两段”锁的含义
事务分为两个阶段 第一阶段是获得封锁,也称为扩展阶段;
并行执行的所有事务均遵守两段锁协议,则对 这些事务的所有并行调度策略都是可串行化的。
所有遵守两段锁协议的事务,其并行守两段锁协议是可串行化调度的充分条 件,而不是必要条件 可串行化的调度中,不一定所有事务都必须符 合两段锁协议。
(2)顺序封锁法
顺序封锁法是预先对数据对象规定一个封锁顺序,所有 事务都按这个顺序实行封锁。 顺序封锁法存在的问题 维护成本高:数据库系统中可封锁的数据对象极其众 多,并且随数据的插入、删除等操作而不断地变化, 要维护这样极多而且变化的资源的封锁顺序非常困难, 成本很高 难于实现:事务的封锁请求可以随着事务的执行而动 态地决定,很难事先确定每一个事务要封锁哪些对象, 因此也就很难按规定的顺序去施加封锁。 例:规定数据对象的封锁顺序为A,B,C,D,E。事务T3 起初要求封锁数据对象B,C,E,但当它封锁了B,C后, 才发现还需要封锁A,这样就破坏了封锁顺序。
结论
在操作系统中广为采用的预防死锁的策略并不 很适合数据库的特点 DBMS在解决死锁的问题上更普遍采用的是诊断 并解除死锁的方法
2. 死锁的诊断与解除
允许死锁发生
解除死锁
由DBMS的并发控制子系统定期检测系统中 是否存在死锁
一旦检测到死锁,就要设法解除
检测死锁:超时法
如果一个事务的等待时间超过了规定的时限, 就认为发生了死锁 优点:实现简单 缺点 有可能误判死锁 时限若设置得太长,死锁发生后不能及时 发现
解除死锁 选择一个处理死锁代价最小的事务,将其撤消, 释放此事务持有的所有的锁,使其它事务能继 续运行下去。
11.5 并发调度的可串行性
什么样的并发操作调度是正确的 如何保证并发操作的调度是正确的
一、什么样的并发操作调度是正确的
计算机系统对并行事务中并行操作的调度是的随 机的,而不同的调度可能会产生不同的结果。 将所有事务串行起来的调度策略一定是正确的调 度策略。 如果一个事务运行过程中没有其他事务在同时 运行,也就是说它没有受到其他事务的干扰, 那么就可以认为该事务的运行结果是正常的或 者预想的 以不同的顺序串行执行事务也有可能会产生不同 的结果,但由于不会将数据库置于不一致状态, 所以都可以认为是正确的。
不可重复读
T2 T1
①读A=50 读B=100 求和=150 ②
T2
读A=15
③读A=50 读B=200 求和=250 (验算不对)
Xlock B 获得 读B=100 B←B*2 写回B=200 Commit Unlock B
2级封锁协议
1级封锁协议+事务T在读取数据R前必须先加S锁, 读完后即可释放S锁 2级封锁协议可以防止丢失修改和读“脏”数据。 在2级封锁协议中,由于读完数据后即可释放S锁, 所以它不能保证可重复读。
二、基本封锁类型
DBMS通常提供了多种类型的封锁。一个事务对某 个数据对象加锁后究竟拥有什么样的控制是由封 锁的类型决定的。 基本封锁类型
排它锁(eXclusive lock,简记为X锁) 共享锁(Share lock,简记为S锁)
排它锁又称为写锁:若事务T对数据对象A加上X 锁,则只允许T读取和修改A,其它任何事务都不 能再对A加任何类型的锁,直到T释放A上的锁
几个事务的并行执行是正确的,当且仅当其结果 与按某一次序串行地执行它们时的结果相同。这 种并行调度策略称为可串行化的调度。
可串行性是并行事务正确性的唯一准则 例:现在有两个事务,分别包含下列操作: 事务1:读B;A=B+1;写回A; 事务2:读A;B=A+1;写回B; 假设A的初值为2,B的初值为2。
检测死锁:等待图法
用事务等待图动态反映所有事务的等待情况
事务等待图是一个有向图G =(T,U)
T为结点的集合,每个结点表示正运行的事务 U为边的集合,每条边表示事务等待的情况
若T1等待T2,则T1,T2之间划一条有向边,从T1 指向T2
并发控制子系统周期性地(比如每隔1 min) 检测事务等待图,如果发现图中存在回路, 则表示系统中出现了死锁。
(2)交叉并发方式(interleaved concurrency)
事务的并行执行是这些并行事务的并行操作轮流 交叉运行 是单处理机系统中的并发方式,能够减少处理机 的空闲时间,提高系统的效率
事务并发执行带来的问题: 可能会存取和存储不正确的数据,破坏 事务的隔离性和数据库的一致性 DBMS必须提供并发控制机制 并发控制机制是衡量一个 DBMS性能的重 要标志之一
第二阶段是释放封锁,也称为收缩阶段。
例: 事务1的封锁序列: Slock A ... Slock B... Xlock C... Unlock B... Unlock A... Unlock C; 事务2的封锁序列: Slock A ... Unlock A... Slock B... Xlock C... Unlock C... Unlock B; 事务1遵守两段锁协议,而事务2不遵守两段协议。
1级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到 事务结束才释放 正常结束(COMMIT) 非正常结束(ROLLBACK)
1级封锁协议可防止丢失修改 在1级封锁协议中,如果是读数据,不需要加锁 的,所以它不能保证可重复读和不读“脏”数据。
没有丢失修改
读“脏”数据
T1
① Xlock A 获得 ② 读A=16 A←A-1 写回A=15 ③ ④ Rollback Unlock A
–丢失修改(lost update) –不可重复读(non-repeatable read) –读“脏”数据(dirty read)
1. 丢失修改
丢失修改是指事务1与事务2从数据库中读入同一数 据并修改,事务 2的提交结果破坏了事务1提交的结 果,导致事务1的修改被丢失。
2. 不可重复读
不可重复读是指事务1读取数据后,事务2执行更新 操作,使事务1无法再现前一次读取结果。
第十一章
并发控制
并发控制概述 封锁 活锁和死锁 并发调度的可串行性 两段锁协议
问题的产生
多用户数据库系统的存在
允许多个用户同时使用的数据库系统 •飞机定票数据库系统 •银行数据库系统 •特点:在同一时刻并发运行的事务数可达数 百
多事务执行方式:
(1)事务串行执行
每个时刻只有一个事务运行,其他事务必须等 到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源 的特点
共享锁又称为读锁:若事务T对数据对象A加上S
锁,则其它事务只能再对A加S锁,而不能加X锁, 直到T释放A上的S锁
11.3 封锁协议
在运用X锁和S锁对数据对象加锁时,需要约定一 些规则:封锁协议(Locking Protocol) 何时申请X锁或S锁 持锁时间、何时释放 不同的封锁协议,在不同的程度上为并发操作的 正确调度提供一定的保证 常用的封锁协议:三级封锁协议
T2
Xlock B
等待 等待
获得Xlock B 读B=100 B←B*2 写回B=200 Commit Unlock B