《第九章 并发控制课件》由会员分享,可在线阅读,更多相关《第九章 并发控制课件(52页珍藏版)》请在金锄头文库上搜索。
1、第九章 并发控制,主要内容:,掌握事务的概念、状态、性质; 掌握并发调度的可串行性; 掌握锁及两段锁协议; 掌握死锁的概念、解决方法。,本章内容:,9.1事务 9.2并发控制,9.1 事务9.1.1事务的概念,事务是一系列数据库操作序列:一条或一组SQL语句;存储过程或其中的一部分。 一个事务是一个完整的操作,是一个整体-它或者完全执行,或者完全不执行 事务是数据库应用程序的基本逻辑单元。 一个应用程序通常包含多个事务。,9.1.2 事务的性质(重点),事务的ACID性质: (1)原子性(Atomicity):每个事务的所有操作要么被成功地执行,要么一个也不被执行。 (2)一致性(数据库正确保
2、持性) (Consistency):一个事务的正确执行必须数据库从一个正确状态转换为另一个正确的状态。 例如:从帐户A转10000元到帐户B: Update account set 余额=余额-10000 where 帐号=A Update account set 余额=余额+10000 where 帐号=B 如果因为某种原因,只执行了第一条语句,数据库中的数据将出现不正确状态.,(3)隔离性(Isolation) ,又称为独立性:多个并发事务之间不能相互干扰;并发不影响事务的执行。 例如:有多个售票窗口同时售火车票(多个并发事务),它们之间互不影响. (4)持续性(操作结果永久保持性) (D
3、urability):事务对数据库的更新必须是永久的;事务一旦提交,则永久改变数据库中的数据。,9.1.3 SQL对事务的支持,事务控制语句(显式事务): 开始事务:Begin transaction 提交事务:Commit transaction 回滚事务:Rollback transaction 隐式事务 如果语句中没有用到begin或commit,每个DML语句都会隐式地构造自己的事务,9.1.4事务的状态 (1)活动状态:事务开始运行就进入活动状态,直到部分提交或失败。 BEGIN-TRANSACTION:事务进入活动状态。 (2)部分提交状态:事务执行完最后一条语句,即执行完END-
4、TRANSACTION命令之后进入部分提交状态,把事务的所有操作对数据库的影响存入数据库。,(3)失败状态:发现一个事务不能正常运行下去时。 ABORT-TRANSACTION:进入失败状态。DBMS消除事务中所有操作对数据库和其他事务的影响,结束事务的运行。 (4)异常结束状态:当一个失败事务对数据库和其他事务的影响被消除,数据库恢复到该事务开始执行前的状态之后,该失败事务退出DBS,进入异常结束状态。,(5)提交状态:当一个事务成功地完成了所有操作,并且所有操作对数据库的影响都已永久地存入数据库之后,该事务退出DBS,进入提交状态,正常结束。 COMMIT-TRANSACTION:事务进入
5、提交状态。,9.2并发控制9.2.1并发控制的概念,串行事务 一个事务结束,另一个事务才开始。 并行事务 多个事务同时执行: 单处理器:分时并发(交叉并发)。 能够减少处理机的空闲时间,提高系统的效率。 多处理器:每个处理器处理一个事务,同时并行。,一、并发控制的必要性 存在问题:多个事务同时存取同一数据,导致数据一致性被破坏。 实例:在飞机订票数据库系统中,设X和Y分别是航班A1和A2对应的数据库记录。,事务T1:取消A1上已经预订的5个座位,并为A2加上5个座位。 事务T2:为航班A1加上3个座位。 1、数据更新丢失问题:(重点:会判),(1)T1和T2的第一种并发运行方式 T1 T2 R
6、EAD(X); X:=X-5; READ(X); X:=X+3; WRITE(X); READ(Y); WRITE(X); Y:=Y+5; WRITE(Y); 分析:若运行前:X=80;则运行后应为:X=78 。但运行结果为:X=83。,时间,(2)T1和T2的第二种并发运行方式 T1 T2 READ(X); X:=X-5; WRITE(X); READ(X); X:=X+3; WRITE(X); READ(Y); 此时T1失败,X的值必须恢复为原来的值,但T2已经使用了X的不正确的临时值。,时间,2、读“脏”数据问题(重点:会判),3、错误聚集计算问题 聚集计算函数在事务中经常出现,如果两个
7、事务并发运行,第一个事务计算数据库的所有记录的某个数据域的和,而第二个事务在更新这个数据域,从而使得第一个事务的计算结果可能出错。 在飞机订票系统中,若定义了事务T3,计算所有航班已经预订出的座位数之和。,(3)T1和T3的一种并发运行方式 T1 T3 SUM:=0 READ(A); SUM:=SUM+A; READ(X); X:=X-5; WRITE(X); READ(X); SUM:=SUM+X; READ(Y); SUM:=SUM+Y; READ(Y); Y:=Y+5; WRITE(Y);,时间,(4)并发控制中存在的其它典型问题:(了解) 不可重复读: 事务T1读取数据C; 并发事务T
8、2读取数据C,并作修改,然后提交; 事务T1继续(再次)读取数据C,同一事务中两次读取的数据C,是不一致的。,幻影数据行(Phantom row)(了解) 事务A读取数据C(满足某条件的数据); 并发事务B插入数据(满足该条件的数据),然后提交; 事务A继续(再次)读取数据C(满足该条件的数据),发现多出一些数据(而其他数据未被修改),就象是幻影一样。 即:同一事务中两次读数据的条数不一致。,9.2.2事务调度与可串行性,一、事务的调度 定义:个事务的一个调度是个事务的所有操作的一个序列,表示这些操作的执行顺序,并且满足对于个事务的每个事务,若操作i在中先于操作j执行,则在中操作i也须先于操作
9、j执行。 、调度的类型 串行调度:一个事务的所有操作都执行完后才执行另一个事务的所有操作。 对于个事务,有!个串行调度。 并行调度:除串行调度的其它调度。,实例:考虑一个简单的银行数据库系统,设每个帐号在库中有一个数据库记录,记录内容包含该帐号的存款数额和其他信息。 设事务T1:从帐号转50元钱到帐号。 事务T2:将帐号存款的10%转到帐号上。,()T1与T2的第一种串行调度方法: T1 T2 READ(A); A:=A-50; WRITE(A); READ(B); B=B+50; WRITEA(B); READ(A); tmp:=A*0.1; A=A-tmp; WRITE(A); READ(
10、B); B=B+tmp; WRITEA(B);,时间,返回,()T1与T2的第二种串行调度方法: T1 T2 READ(A); tmp:=A*0.1; A=A-tmp; WRITE(A); READ(B); B=B+tmp; WRITEA(B); READ(A); A:=A-50; WRITE(A); READ(B); B=B+50; WRITEA(B);,时间,返回,()T1与T2的一种并行调度方法: T1 T2 READ(A); A:=A-50; WRITE(A); READ(A); tmp:=A*0.1; A=A-tmp; WRITE(A); READ(B); B=B+50; WRITE
11、A(B); READ(B); B=B+tmp; WRITEA(B);,时间,()T1与T2的一种有更新丢失问题的并行调度方法: T1 T2 READ(A); A:=A-50; READ(A); tmp:=A*0.1; A=A-tmp; WRITE(A); READ(B); WRITE(A); READ(B); B=B+50; WRITEA(B); B=B+tmp; WRITEA(B);,时间,返回,注:由 (4)可得:给定个事务,并不是所有的并行调度都具有与串行调度相同的效果。 二、调度的可串行性 个事务的调度是可串行的,即可等价于一个串行调度。,9.2.3基于锁的并发控制协议,锁(Locki
12、ng) 并发调度的主要技术封锁。 事务对需操作的数据进行加锁,以实现数据的互斥访问。 当一个事务访问某个数据项时,其他事务都不能修改该数据项。 对数据的访问均必须加锁。,一、锁的两种类型:(重点) 共享锁(Share lock,简记为S锁): 读锁。 多个事务可对同一数据重复申请加读锁。 事务T对数据Q加了S锁,其它事务可再对数据Q加S锁,而不能对数据Q加X锁(互斥锁),直到T释放数据Q上的S锁。,互斥锁(又称为排它锁)(eXclusive lock,简记为X锁): 写锁。 一旦事务T对数据Q加上了X锁,只允许T对其进行读写。 其他事务需等T释放X锁之后,才能获锁。 注:其它事务不能对数据Q再
13、加S锁和X锁。,二、锁操作 LOCK-S(Q):申请数据项Q上的共享锁。 LOCK-X(Q):申请数据项Q上的互斥锁。 UNLOCK(Q):释放数据项Q上的锁。 三、封锁协议 运用X锁和S锁对数据对象加锁时,需要约定一些规则:封锁协议(Locking Protocol)。 何时申请X锁或S锁; 持锁时间、何时释放 不同的封锁协议,在不同的程度上为并发操 作的正确调度提供一定的保证。 常用的封锁协议:三级封锁协议。,(1)一级封锁协议 事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。 正常结束(COMMIT) 非正常结束(ROLLBACK) 一级封锁协议可防止丢失修改,并保证事务T是
14、可恢复的。 在一级封锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读“脏”数据。,例:没有丢失修改,例:读“脏”数据,(2)二级封锁协议 事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。 事务T在读取数据R前必须先加S锁,读完后即可释放S锁。 可以防止丢失修改和读“脏”数据。由于读完数据后即可释放S锁,所以它不能保证可重复读。,例:不可重复读,(3)三级封锁协议 事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。 事务T在读取数据R前必须先加S锁,直到事务结束才释放。 可以防止丢失修改和读“脏”数据,还防止了不可重复读。,例:可重复读,例:不读“脏”数据
15、,三级协议的主要区别:(了解),四、活锁和死锁(重点) 封锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题: (1)活锁:多个事务申请对数据R加锁,而系统随机地加锁,导致某些事务长等,如:,避免活锁的方法:采用先来先服务的策略。 当多个事务请求封锁同一数据对象时,按请求封锁的先后次序对这些事务排队。 该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。 (2)死锁:两个(或多个)事务互相申请对方加锁对象的排它锁,造成循环等待。,T1 T2,LOCK-X( R1) . . . LOCK-X(R2) 等待 等待 等待 .,. . LOCK-X( R2) . . LOCK-X(R1) 等待 等待 .,死锁实例,解决死锁问题二类方法: 1)预防死锁 2)死锁的诊断与解除 1、死锁的预防 一次加锁法