1、An Introduction to Database System,淮海工学院,数据库原理与应用第七章 并发控制,An Introduction to Database System,第七章 并发控制,7.1 事物的基本概念 7.2 并发操作与数据的不一致性 7.3 封锁 7.4 活锁和死锁 7.5 并发调度的可串行性 7.6 两段锁协议,An Introduction to Database System,7.1 事务的基本概念,一、事务定义二、事务的特性,An Introduction to Database System,一、事务(Transaction),定义 一个数据库操作序列 一
2、个不可分割的工作单位事务和程序比较 在关系数据库中,一个事务可以是一条或多条SQL语句,也可以包含一个或多个程序。 一个程序通常包含多个事务,An Introduction to Database System,定义事务,显式定义方式BEGIN TRANSACTION BEGIN TRANSACTIONSQL 语句1 SQL 语句1 SQL 语句2 SQL 语句2 COMMIT ROLLBACK 隐式方式 当用户没有显式地定义事务时, DBMS按缺省规定自动划分事务,An Introduction to Database System,二、事务的特性(ACID特性),事务的ACID特性: 原子
3、性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持续性(Durability ),An Introduction to Database System,第七章 并发控制,7.1 事物的基本概念 7.2 并发操作与数据的不一致性 7.3 封锁 7.4 活锁和死锁 7.5 并发调度的可串行性 7.6 两段锁协议,An Introduction to Database System,问题的产生,多用户数据库系统的存在允许多个用户同时使用的数据库系统 飞机定票数据库系统银行数据库系统 特点:在同一时刻并发运行的事务数可达数百个,An Introduction
4、to Database System,问题的产生(续),不同的多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源的特点,T1,T2,T3,事务的串行执行方式,An Introduction to Database System,问题的产生(续),(2)交叉并发方式(Interleaved Concurrency) 在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行 单处理机系统中的并行事务并没有真正地并行运行,但能够减少处理机的空闲时间,提高系统的效率,An Introduction
5、 to Database System,问题的产生(续),事务的交叉并发执行方式,An Introduction to Database System,问题的产生(续),(3)同时并发方式(simultaneous concurrency) 多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行,An Introduction to Database System,问题的产生(续),事务并发执行带来的问题 会产生多个事务同时存取同一数据的情况 可能会存取和存储不正确的数据,破坏事务一致性和数据库的一致性,An Introduction to Da
6、tabase System,T1的修改被T2覆盖了!,7.2 并发操作与数据的不一致性,并发操作带来数据的不一致性实例 例1飞机订票系统中的一个活动序列 甲售票点(甲事务)读出某航班的机票余额A,设A=16; 乙售票点(乙事务)读出同一航班的机票余额A,也为16; 甲售票点卖出一张机票,修改余额AA-1,所以A为15,把A写回数据库; 乙售票点也卖出一张机票,修改余额AA-1,所以A为15,把A写回数据库 结果明明卖出两张机票,数据库中机票余额只减少1,An Introduction to Database System,并发控制概述(续),这种情况称为数据库的不一致性,是由并发操作引起的。
7、在并发操作情况下,对甲、乙两个事务的操作序列的调度是随机的。 若按上面的调度序列执行,甲事务的修改就被丢失。 原因:第4步中乙事务修改A并写回后覆盖了甲事务的修改,An Introduction to Database System,并发控制概述(续),并发操作带来的数据不一致性 丢失修改(Lost Update) 不可重复读(Non-repeatable Read) 读“脏”数据(Dirty Read) 记号 R(x):读数据x W(x):写数据x,An Introduction to Database System,1. 丢失修改,两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了
8、T1提交的结果,导致T1的修改被丢失。,飞机订票,An Introduction to Database System,2. 读“脏”数据,读“脏”数据是指: 事务T1修改某一数据,并将其写回磁盘 事务T2读取同一数据后,T1由于某种原因被撤销 这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致 T2读到的数据就为“脏”数据,即不正确的数据,An Introduction to Database System,读“脏”数据(续),例如,读“脏”数据,An Introduction to Database System,3. 不可重复读,不可重复读是指事务T1读取数据后,事务
9、T2执行更新操作,使T1无法再现前一次读取结果。,An Introduction to Database System,第七章 并发控制,7.1 事物的基本概念 7.2 并发操作与数据的不一致性 7.3 封锁 7.4 活锁和死锁 7.5 并发调度的可串行性 7.6 两段锁协议,An Introduction to Database System,7.3 封锁,7.3.1 什么是封锁 7.3.2 基本封锁类型 7.3.3 锁的相容矩阵,An Introduction to Database System,7.3.1 什么是封锁,封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发
10、出请求,对其加锁 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。,An Introduction to Database System,7.3.2 基本封锁类型,基本封锁类型 排它锁(Exclusive Locks,简记为X锁) 共享锁(Share Locks,简记为S锁),An Introduction to Database System,排它锁,排它锁又称为写锁 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁 保证其他事务在T释放A上的锁之前不能再读取和修改A,An Int
11、roduction to Database System,共享锁,共享锁又称为读锁 若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁 保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改,An Introduction to Database System,7.3.3 锁的相容矩阵,Y=Yes,相容的请求 N=No,不相容的请求,An Introduction to Database System,使用封锁机制解决丢失修改问题,例:,没有丢失修改,An Introduction to Database System,使用封锁机制解决读“脏
12、”数据问题,例,不读“脏”数据,An Introduction to Database System,使用封锁机制解决不可重复读问题,可重复读,An Introduction to Database System,第七章 并发控制,7.1 事物的基本概念 7.2 并发操作与数据的不一致性 7.3 封锁 7.4 活锁和死锁 7.5 并发调度的可串行性 7.6 两段锁协议,An Introduction to Database System,7.4 活锁和死锁 活锁,活 锁,An Introduction to Database System,活锁(续),避免活锁:采用先来先服务的策略 当多个事务
13、请求封锁同一数据对象时 按请求封锁的先后次序对这些事务排队 该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁,An Introduction to Database System,7.4 活锁和死锁死锁,死 锁,返回,An Introduction to Database System,解决死锁的方法,两类方法 1. 预防死锁 2. 死锁的诊断与解除,An Introduction to Database System,1.死锁的预防(续),预防死锁的方法一次封锁法顺序封锁法,An Introduction to Database System,(1)一次封锁法,要求每个事务必须一
14、次将所有要使用的数据全部加锁,否则就不能继续执行,An Introduction to Database System,(2)顺序封锁法,顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。 例,An Introduction to Database System,2. 死锁的诊断与解除,死锁的诊断 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁 事务等待图法,An Introduction to Database System,(2)等待图法,用事务等待图动态反映所有事务的等待情况 事务等待图是一个有向图G=(T,U) T为结点的集合,每个结点表示正运
15、行的事务 U为边的集合,每条边表示事务等待的情况 若T1等待T2,则T1,T2之间划一条有向边,从T1指向T2,事务等待图,An Introduction to Database System,死锁的诊断与解除(续),解除死锁 选择一个处理死锁代价最小的事务,将其撤消 释放此事务持有的所有的锁,使其它事务能继续运行下去,An Introduction to Database System,第七章 并发控制,7.1 事物的基本概念 7.2 并发操作与数据的不一致性 7.3 封锁 7.4 活锁和死锁 7.5 并发调度的可串行性 7.6 两段锁协议,An Introduction to Databa
16、se System,7.5 并发调度的可串行性,DBMS对并发事务不同的调度可能会产生不同的结果 什么样的调度是正确的?,An Introduction to Database System,7.5.1 可串行化调度,可串行化(Serializable)调度 多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同 可串行性(Serializability) 是并发事务正确调度的准则 一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度,An Introduction to Database System,可串行化调度(续),例现在有两个事务,分别包含下列操
17、作: 事务T1:读B;A=B+1;写回A 事务T2:读A;B=A+1;写回B 现给出对这两个事务不同的调度策略,An Introduction to Database System,串行化调度,正确的调度,串行调度(a),假设A、B的初值均为2。 按T1T2次序执行结果为A=3,B=4 串行调度策略,正确的调度,事务T1:读B;A=B+1;写回A 事务T2:读A;B=A+1;写回B,An Introduction to Database System,串行化调度,正确的调度,串行调度(b),假设A、B的初值均为2。 T2T1次序执行结果为B=3,A=4 串行调度策略,正确的调度,事务T1:读B
18、;A=B+1;写回A 事务T2:读A;B=A+1;写回B,An Introduction to Database System,不可串行化调度,错误的调度,不可串行化的调度,执行结果与(a)、(b)的结果都不同 是错误的调度,An Introduction to Database System,可串行化调度,正确的调度,可串行化的调度,执行结果与串行调度(a)的执行结果相同 是正确的调度,An Introduction to Database System,第七章 并发控制,7.1 事物的基本概念 7.2 并发操作与数据的不一致性 7.3 封锁 7.4 活锁和死锁 7.5 并发调度的可串行性
19、7.6 两段锁协议,An Introduction to Database System,7.6 两段锁协议,封锁协议运用封锁方法时,对数据对象加锁时需要约定一些规则 何时申请封锁 持锁时间 何时释放封锁等 两段封锁协议(Two-Phase Locking,简称2PL)是最常用的一种封锁协议,理论上证明使用两段封锁协议产生的是可串行化调度,An Introduction to Database System,两段锁协议(续),两段锁协议指所有事务必须分两个阶段对数据项加锁和解锁 第一阶段是获得封锁,也称为扩展阶段在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁第二阶段是释放封锁,也
20、称为收缩阶段在释放一个封锁之后,事务不再申请和获得任何其他封锁,An Introduction to Database System,两段锁协议(续),例 事务Ti遵守两段锁协议,其封锁序列是 : Slock A Slock B Xlock C Unlock B Unlock A Unlock C; 事务Tj不遵守两段锁协议,其封锁序列是: Slock A Unlock A Slock B Xlock C Unlock C Unlock B;,An Introduction to Database System,两段锁协议(续),左图的调度是遵守两段锁协议的,因此一定是一个可串行化调度。,An Introduction to Database System,下课了。,休息一会儿。,探 索,