1、事务管理与恢复目目 录录事务事务 10.1并发控制并发控制 10.2恢复与备份恢复与备份 10.3问题背景问题背景 n 现实应用中,现实应用中,数据库的操作与操作之间往往具有一定的语义数据库的操作与操作之间往往具有一定的语义和关联性和关联性。数据库应用希望。数据库应用希望将这些有关联的操作当作一个逻将这些有关联的操作当作一个逻辑工作单元辑工作单元看待,看待,要么都执行,要么都不执行要么都执行,要么都不执行。n 例例10.1 飞机订票系统有两个表飞机订票系统有两个表Sale和和Flight,分别记录各售,分别记录各售票点的票点的售票数售票数及全部航班的及全部航班的剩余票数剩余票数:Sale(ag
2、entNo,flightNo,date,saledNumber)Flight(flightNo,date,remainNumber)n 现有现有A0010售票点欲出售售票点欲出售F005航班航班2008年年8月月8日机票日机票2张。张。问题背景问题背景n 可编制如下程序:可编制如下程序:查询查询F005航班航班2008年年8月月8日剩余票数日剩余票数A;(1)if (A2)拒绝操作,并通知票源不足;拒绝操作,并通知票源不足;else 更新更新A0010售票点的售票数;售票点的售票数;更新更新F005航班的剩余票数;航班的剩余票数;如何用如何用SQLSQL语句分别实现语句语句分别实现语句(1)(
3、1)和语句和语句(2)(2)?n 语句语句(1)可用可用SQL语句表示为:语句表示为:SELECT remainNumber FROM Flight WHERE flightNo=F005 AND date=2008-08-08(2)问题背景问题背景n 语句语句(2)是在当是在当F005航班航班2008年年8月月8日的剩余票数大于请求日的剩余票数大于请求票数时更新票数时更新Sale和和Flight表。该更新包括两个表。该更新包括两个update操作:操作:UPDATE Sale SET saledNumber=saledNumber+2 WHERE agentNo=A0010 AND flig
4、htNo=F005 AND date=2008-08-08 UPDATE Flight SET remainNumber=remainNumber2 WHERE flightNo=F005 AND date=2008-08-08如果第一个如果第一个UPDATEUPDATE语句执行语句执行成功成功,而第二个,而第二个UPDATEUPDATE语句执行语句执行失败失败,会发生什么问题呢?会发生什么问题呢?问题背景问题背景n 假设假设F005航班共有航班共有200个座位,个座位,2008年年8月月8日机票已售日机票已售198张张(其中被其中被A0010售出售出20张张),余票,余票2张。张。n 当第当
5、第1个个UPDATE语句执行成功时,即语句执行成功时,即A0010已售票数更新为已售票数更新为22。当系统发生故障重新提供服务时,如果又有售票点请求。当系统发生故障重新提供服务时,如果又有售票点请求出售出售F005航班航班2008年年8月月8日机票日机票2张,由于张,由于F005的剩余票数的剩余票数未更新未更新(仍为仍为2),因此满足其要求又出售了,因此满足其要求又出售了2张。张。n 结果多卖了结果多卖了2张票!张票!出现上述问题的原因是什么?出现上述问题的原因是什么?出现故障后出现故障后,系统重新提供服务时,系统重新提供服务时数据库状态数据库状态与与现实世界状态现实世界状态出出现了现了不一致
6、不一致。对于机票系统来说,一航班的剩余票数加上已售出票数。对于机票系统来说,一航班的剩余票数加上已售出票数应等于该航班全部座位数。而重新提供服务时,应等于该航班全部座位数。而重新提供服务时,F005F005的已售票数与剩的已售票数与剩余票数之和为余票数之和为202(202(不等于不等于200!)200!),导致多买了,导致多买了2 2张。张。问题背景问题背景n 为解决上述问题,数据库管理系统引入了为解决上述问题,数据库管理系统引入了事务事务概念,它概念,它将这些有内在联系的操作当作一个逻辑单元看待将这些有内在联系的操作当作一个逻辑单元看待,并采,并采取相应策略取相应策略保证一个逻辑单元内的全部
7、操作保证一个逻辑单元内的全部操作要么都执行要么都执行成功,要么都不执行成功,要么都不执行。n 对数据库用户而言,只需对数据库用户而言,只需将具有完整逻辑意义的一组操将具有完整逻辑意义的一组操作正确地作正确地定义在一个事务之内定义在一个事务之内即可。即可。事务概念事务概念 n 对于对于用户用户而言,而言,事务事务是是具有完整逻辑意义的数据库操作序列具有完整逻辑意义的数据库操作序列的集合。的集合。n 对于对于数据库管理系统数据库管理系统而言,而言,事务事务则是则是一个一个读写操作序列读写操作序列。这。这些操作是一个不可分割的逻辑工作单元,些操作是一个不可分割的逻辑工作单元,要么都做要么都做,要么都
8、要么都不做不做。n 事务事务是数据库管理系统中是数据库管理系统中竞争资源、并发控制和恢复的基本竞争资源、并发控制和恢复的基本单元单元。它是由数据库操作语言它是由数据库操作语言(如如SQL)或高级编程语言(如或高级编程语言(如Java、C、C+)提供的)提供的事务开始语句事务开始语句、事务结束语句事务结束语句以及以及由它们包含的全部由它们包含的全部数据库操作语句数据库操作语句组成。组成。事务结束语句事务结束语句n 事务结束的两种类型:事务结束的两种类型:l事务提交事务提交(commit):将成功完成事务的:将成功完成事务的执行结果执行结果(即更新即更新)永久化永久化,并释放事务占有的全部资源。,
9、并释放事务占有的全部资源。l事务回滚事务回滚(rollback):中止当前事务、:中止当前事务、撤销其对数据库所撤销其对数据库所做的更新做的更新,并释放事务占有的全部资源。,并释放事务占有的全部资源。SQL Server事务模式事务模式n SQL Server数据库提供了三种类型的事务模式:数据库提供了三种类型的事务模式:l显式事务显式事务是指用户是指用户使用使用Transact-SQL事务语句所定义事务语句所定义的事务的事务,其事务语句包括:,其事务语句包括:事务开始事务开始:BEGIN TRANSACTION事务提交事务提交:COMMIT TRANSACTION,COMMIT WORK事务
10、回滚事务回滚:ROLLBACK TRANSACTION,ROLLBACK WORKl隐式事务隐式事务是指事务提交或回滚后,系统自动开始新的是指事务提交或回滚后,系统自动开始新的事务。事务。该类事务不需要采用该类事务不需要采用BEGIN TRANSACTION语句标识事务的开始。但必须有显示式结束。语句标识事务的开始。但必须有显示式结束。l自动定义事务自动定义事务:当一个语句成功执行后,它被自动提当一个语句成功执行后,它被自动提交,而当执行过程中出错时,则被自动回滚交,而当执行过程中出错时,则被自动回滚。SQL Server事务定义举例事务定义举例n 例例10.2 利用利用SQL Server提
11、供的显式事务模式定义提供的显式事务模式定义例例10.1中的数据库更新事务。中的数据库更新事务。BEGIN TRANSACTION UPDATE Sale SET saledNumber=saledNumber+2 WHERE agentNo=A0010 AND flightNo=F005 AND date=2008-08-08 UPDATE Flight SET remainNumber=remainNumber-2 WHERE flightNo=F005 AND date=2008-08-08 COMMIT TRANSACTION事务特性事务特性 n 为了保证事务为了保证事务并发执行并发执行
12、或或发生故障发生故障时数据库的时数据库的一致性一致性(完整性完整性),事务应具有以下特性:),事务应具有以下特性:l原子性原子性(atomicity)。事务的。事务的所有操作所有操作要么要么全部都被执行,全部都被执行,要么都不被执行。要么都不被执行。l一致性一致性(consistency)。一个单独执行的事务一个单独执行的事务应保证其执行应保证其执行结果的一致性,即总是结果的一致性,即总是将数据库从一个一致性状态转化到将数据库从一个一致性状态转化到另一个一致性状态另一个一致性状态。l隔离性隔离性(isolation)。当。当多个事务并发执行多个事务并发执行时,一个事务的时,一个事务的执行不能影
13、响另一个事务,即执行不能影响另一个事务,即并发执行的各个事务不能互并发执行的各个事务不能互相干扰相干扰。l持久性持久性(durability)。一个。一个事务成功提交事务成功提交后,后,它对数据库的它对数据库的改变必须是永久的改变必须是永久的,即使随后系统出现故障也不会受到影,即使随后系统出现故障也不会受到影响。响。DBMS保证事务特性措施保证事务特性措施n 原子性原子性也称为也称为故障原子性故障原子性或或(故障故障)可靠性可靠性l 由由DBMS通过通过撤销未完成事务对数据库的影响撤销未完成事务对数据库的影响来实现。来实现。n 一致性一致性是指是指单个事务的一致性单个事务的一致性,也称为,也称
14、为并发原子性并发原子性或或正确性正确性l 由编写该事务代码的由编写该事务代码的应用程序员应用程序员负责,但有时也可利用负责,但有时也可利用DBMS提供的提供的数据库完整性约束数据库完整性约束(如触发器如触发器)的自动检查功能来保证的自动检查功能来保证。n 隔离性隔离性也称为也称为执行原子性执行原子性或或可串行化可串行化,可以看作是多个事务,可以看作是多个事务并发执行时的一致性或正确性要求并发执行时的一致性或正确性要求l 由由DBMS的的并发控制模块并发控制模块保证。保证。n 持久性持久性也称为也称为恢复原子性恢复原子性或或恢复可靠性恢复可靠性l 它是利用已记录在它是利用已记录在稳固存储介质稳固
15、存储介质(如如磁盘阵列磁盘阵列)中的恢复信息中的恢复信息(如日志、如日志、备份等备份等)来实现丢失数据来实现丢失数据(如因中断而丢失的存放在主存中但还未保存如因中断而丢失的存放在主存中但还未保存到磁盘数据库中去的数据等到磁盘数据库中去的数据等)的恢复。的恢复。l 它是由它是由DBMS的的恢复管理模块恢复管理模块保证。保证。事务并发执行事务并发执行n 数据库管理系统数据库管理系统允许多个事务并发执行:允许多个事务并发执行:l优点优点增加系统吞吐量增加系统吞吐量(throughput)。吞吐量吞吐量是指是指单位时间系统完成事务单位时间系统完成事务的数量的数量。当一事务需等待磁盘。当一事务需等待磁盘
16、I/O时,时,CPU可去处理其它正在等待可去处理其它正在等待CPU的事务。这样,可减少的事务。这样,可减少CPU和磁盘空闲时间,增加给定时间和磁盘空闲时间,增加给定时间内完成事务的数量。内完成事务的数量。减少平均响应时间减少平均响应时间(average response time)。事务响应时间事务响应时间是指是指事事务从提交给系统到最后完成所需要的时间务从提交给系统到最后完成所需要的时间。事务的执行时间有长。事务的执行时间有长有短,如果按事务到达的顺序依次执行,则短事务就可能会由于有短,如果按事务到达的顺序依次执行,则短事务就可能会由于等待长事务导致完成时间的延长。如果允许并发执行,等待长事
17、务导致完成时间的延长。如果允许并发执行,短事务可短事务可以较早地完成以较早地完成。因此,并发执行可减少事务的平均响应时间。因此,并发执行可减少事务的平均响应时间。l缺点缺点若不对事务的并发执行加以控制,则可能若不对事务的并发执行加以控制,则可能破坏数据库的一致性破坏数据库的一致性。事务并发执行可能出现的问题事务并发执行可能出现的问题n 读脏数据读脏数据。如果事务如果事务T2读取事务读取事务T1修改但未提交修改但未提交的的数据后,事务数据后,事务T1由于某种原因由于某种原因中止而撤销中止而撤销,这时事,这时事务务T2就读取了不一致的数据。数据库中就读取了不一致的数据。数据库中将这种读未将这种读未
18、提交且被撤销的数据为读提交且被撤销的数据为读“脏数据脏数据”。n 丢失更新丢失更新。两个或多个事务都读取了同一数据值并。两个或多个事务都读取了同一数据值并修改,修改,最后提交事务最后提交事务的执行结果覆盖了的执行结果覆盖了前面提交事前面提交事务务的执行结果,从而导致前面事务的更新被丢失的执行结果,从而导致前面事务的更新被丢失。事务并发执行可能出现的问题事务并发执行可能出现的问题n 不可重复读不可重复读。是指事务。是指事务Ti两次从数据库中读取的结果不两次从数据库中读取的结果不同,可分为三种情况:同,可分为三种情况:l事务事务Ti读取一数据后,读取一数据后,事务事务Tj对该数据进行了更改对该数据
19、进行了更改。当事。当事务务Ti再次读该数据时,则再次读该数据时,则会读到与前一次不同的值会读到与前一次不同的值。l事务事务Ti按某条件读取数据库中某些记录后,按某条件读取数据库中某些记录后,事务事务Tj删除了删除了其中部分记录其中部分记录。当事务。当事务Ti再次按相同条件读取时,再次按相同条件读取时,发现记发现记录数变少了录数变少了。(幻影现象(幻影现象1)l事务事务Ti按某条件读取数据库中某些记录后,按某条件读取数据库中某些记录后,事务事务Tj插入了插入了新的记录新的记录。当事务。当事务Ti再次按相同条件读取时,再次按相同条件读取时,发现记录数发现记录数变多了变多了。(幻影现象(幻影现象2)
20、事务并发执行问题举例事务并发执行问题举例n 例例10.3 设设A航班的剩余票数为航班的剩余票数为10张,有两个事务张,有两个事务T1和和T2同时请求出售该航班机票同时请求出售该航班机票2张和张和3张。它们各自的执行序张。它们各自的执行序列如图列如图10-1所示所示(这里只考虑对航班剩余票数的更新这里只考虑对航班剩余票数的更新)。T1R(A)A=A-2W(A)T2R(A)A=A-3W(A)图图10-1 更新事务更新事务T1和和T2事务并发执行问题举例事务并发执行问题举例n 如果是如果是串行执行串行执行,则不管是,则不管是T1先执行再执行先执行再执行T2(图图10-2(a),还是还是T2先执行再执
21、行先执行再执行T1(图图10-2(b),都可得到正确的执行结,都可得到正确的执行结果,即剩余票数都为果,即剩余票数都为5。T1R(A)A=A-2W(A)T2R(A)A=A-3W(A)T1R(A)A=A-2W(A)T2R(A)A=A-3W(A)A1088 5A10775(a)(b)图图10-2 T1和和T2串行执行串行执行事务并发执行问题举例事务并发执行问题举例n 读脏数据读脏数据:在图在图10-3中,事务中,事务T1在在T2读取其读取其更新值更新值(8)后后回回滚滚,而,而T2仍然使用读到仍然使用读到T1修改后的值进行运算,得到的修改后的值进行运算,得到的结结果是果是5。但实际上。但实际上T1
22、未执行成功,系统只出售了未执行成功,系统只出售了3张票,张票,余余票数应为票数应为7。T1R(A)A=A-2W(A)rollback T2R(A)A=A-3W(A)A10885图图10-3 T2读脏数据读脏数据事务并发执行问题举例事务并发执行问题举例n 不可重复读不可重复读:如图:如图10-4所示,所示,T3第一次读时第一次读时余票数为余票数为10张张,第二次读时为第二次读时为8张张,两次读结果不一致。,两次读结果不一致。T3R(A)R(A)A101088 T1R(A)A=A-2W(A)图图10-4 T3不可重复读不可重复读事务并发执行问题举例事务并发执行问题举例n 丢失更新丢失更新:在图:在
23、图10-5中,中,T1和和T2都读到都读到余票数为余票数为10,由于,由于T1后于后于T2提交,导致提交,导致T2的更新操作没有发生作用,被的更新操作没有发生作用,被T1的的更新更新值值(8)覆盖覆盖。T1R(A)A=A-2W(A)T2R(A)A=A-3W(A)A1010788图图10-5 T2更新丢失更新丢失 是不是所有并发是不是所有并发执行事务都会出执行事务都会出现这些问题呢?现这些问题呢?事务并发执行得到正确的结果事务并发执行得到正确的结果n 例例10.4 设设A和和B航班的剩航班的剩余票数分别为余票数分别为10和和15,事,事务务T4与与T5并发执行。事务并发执行。事务T4请求出售请求
24、出售A航班机票航班机票2张张和和B航班机票航班机票2张,事务张,事务T5请求出售请求出售A航班机票航班机票3张和张和B航班机票航班机票3张。它们的执张。它们的执行序列如图行序列如图10-6所示。所示。图图10-6 T4和和T5并发执行并发执行T4R(A)A=A-2W(A)R(B)B=B-2W(B)T5R(A)A=A-3W(A)R(B)B=B-3W(B)B15131310A10885n 可以验证图可以验证图10-6中中并发执行并发执行的结的结果与果与T4、T5按先后顺序按先后顺序串行执行串行执行的结果是一样的,也是正确的。的结果是一样的,也是正确的。启示:启示:如果一组如果一组并发并发执行执行事
25、务的执行结果事务的执行结果与它们与它们串行执行串行执行得到得到的结果是相同的,那的结果是相同的,那么就可以认为该并发么就可以认为该并发执行的结果是正确的。执行的结果是正确的。目目 录录事务事务 10.1并发控制并发控制 10.2恢复与备份恢复与备份 10.3并发控制概述并发控制概述n 并发控制机制大体上可分为并发控制机制大体上可分为悲观的悲观的和和乐观的乐观的两种。两种。n 悲观的并发控制方法悲观的并发控制方法认为数据库的一致性经常会受认为数据库的一致性经常会受到破坏,因此到破坏,因此在事务访问数据对象前须采取一定措在事务访问数据对象前须采取一定措施加以控制施加以控制,只有得到访问许可时,才能
26、访问数据,只有得到访问许可时,才能访问数据对象,如对象,如基于封锁的并发控制方法基于封锁的并发控制方法。n 乐观的并发控制方法乐观的并发控制方法则认为数据库的一致性通常不则认为数据库的一致性通常不会遭到破坏,故事务执行时可直接访问数据对象,会遭到破坏,故事务执行时可直接访问数据对象,只在事务结束时才验证数据库的一致性是否会遭到只在事务结束时才验证数据库的一致性是否会遭到破坏破坏,如,如基于有效性验证方法基于有效性验证方法。n 本章介绍本章介绍基于封锁的并发控制方法基于封锁的并发控制方法。基于封锁方法的基本思想基于封锁方法的基本思想n 基本思想基本思想:当事务当事务T需访问数据对象需访问数据对象
27、Q时,先申请对时,先申请对Q的的锁。锁。如批准获得,则事务如批准获得,则事务T继续执行,继续执行,且此后不允许其且此后不允许其他任何事务修改他任何事务修改Q,直到事务,直到事务T释放释放Q上的锁为止。上的锁为止。n 基本锁类型:基本锁类型:l共享锁共享锁(shared lock,记为记为S):如果事务):如果事务T获得了数据对获得了数据对象象Q的共享锁,则事务的共享锁,则事务T可读可读Q但不能写但不能写Q。l排它锁排它锁(eXclusive lock,记为记为X):如果事务):如果事务T获得了数据获得了数据对象对象Q上的排它锁,则事务上的排它锁,则事务T既可读既可读Q又可写又可写Q。锁相容性锁
28、相容性n“锁相容锁相容”是指如果是指如果Ti已持有数据对象已持有数据对象Q的某类型锁后,事务的某类型锁后,事务Tj也申请对也申请对Q的封锁。如果的封锁。如果允许事务允许事务Tj获得对获得对Q的锁的锁,则称事,则称事务务Tj申请锁类型与事务申请锁类型与事务Ti的持有的持有锁类型相容锁类型相容;否则称为不相容;否则称为不相容。n 基本锁类型的封锁相容性原则:基本锁类型的封锁相容性原则:l共享锁与共享锁共享锁与共享锁相容相容l排它锁与共享锁排它锁与共享锁、排它锁与排它锁排它锁与排它锁是不相容的。是不相容的。X+SXS TiTj图图10-12 基本锁类型的相容性矩阵基本锁类型的相容性矩阵“”表示相容表
29、示相容“”表示不相表示不相容容单个事务封锁举例单个事务封锁举例n 申请和释放锁操作:申请和释放锁操作:lSL(Q)申请申请数据对象数据对象Q上的上的共享锁共享锁;lXL(Q)申请申请数据对象数据对象Q上的上的排它锁排它锁;lUL(Q)释放释放数据对象数据对象Q上的锁。上的锁。n 例例10.6 假设事务在访问完数据对象后假设事务在访问完数据对象后立即释放锁立即释放锁,则,则添加了封锁操作的事务添加了封锁操作的事务T4操作序列如图操作序列如图10-12所示。由所示。由于事务于事务T4要对要对A、B进行读写操作,因此访问进行读写操作,因此访问A和和B之前之前都使用都使用XL操作申请排它锁。这样操作申
30、请排它锁。这样事务事务T4在释放在释放A(或或B)的封锁之前,其他事务不能访问的封锁之前,其他事务不能访问A(或或B)。T4XL(A)R(A)A=A-2W(A)UL(A)XL(B)R(B)B=B-2W(B)UL(B)COMMIT图图10-13 增加了封锁的事务增加了封锁的事务T4操作序列操作序列 封锁能否保证并发执行事务的封锁能否保证并发执行事务的冲突可串行化?冲突可串行化?其他事务在此期间不允许访问其他事务在此期间不允许访问数据对象数据对象A其他事务在此期间不允许访问其他事务在此期间不允许访问数据对象数据对象B 并发事务封锁举例并发事务封锁举例n 例例10.7 考虑并发事务考虑并发事务T1、
31、T2和和T3,它们申请锁和释,它们申请锁和释放锁的规则是:放锁的规则是:l访问数据对象前根据操作类型申请锁;访问数据对象前根据操作类型申请锁;l访问完后访问完后立即释放锁立即释放锁;l当一个事务释放锁后,由等待时间较长的事务优先获当一个事务释放锁后,由等待时间较长的事务优先获得锁。得锁。它们的一个可能的并发执行过程如图它们的一个可能的并发执行过程如图10-13所示。所示。T1XL(A)等待等待等待等待等待等待R(A)A=A-2W(A)UL(A)ROLLBACKT2XL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)A=A-3W(A)UL(A)COMMITT3SL(A)R(
32、A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-14 T1、T2和和T3上锁操作序列上锁操作序列该调度存在该调度存在什么问题什么问题?并发事务封锁举例并发事务封锁举例n 该调度该调度避免了丢失更避免了丢失更新新,即,即不会有多个写不会有多个写事务读取同一数据对事务读取同一数据对象的相同值象的相同值,因为一,因为一个数据对象任何时候个数据对象任何时候只能有一个排它锁。只能有一个排它锁。T1XL(A)等待等待等待等待等待等待R(A)A=A-2W(A)UL(A
33、)ROLLBACKT2XL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)A=A-3W(A)UL(A)COMMITT3SL(A)R(A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-14 T1、T2和和T3上锁操作序列上锁操作序列并发事务封锁举例并发事务封锁举例n 但仍然存在以下问题:但仍然存在以下问题:l读脏数据读脏数据。如。如T2在步在步骤骤11读了读了T1修改后的修改后的数据,而数据,而T1在步骤在步骤12需需ROLLBACK。
34、T1XL(A)等待等待等待等待等待等待R(A)A=A-2W(A)UL(A)ROLLBACKT2XL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)A=A-3W(A)UL(A)COMMITT3SL(A)R(A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-14 T1、T2和和T3上锁操作序列上锁操作序列并发事务封锁举例并发事务封锁举例n 但仍然存在以下问题:但仍然存在以下问题:l不可重复读不可重复读。如。如T3两两次读到次读到A的值不同
35、。的值不同。T1XL(A)等待等待等待等待等待等待R(A)A=A-2W(A)UL(A)ROLLBACKT2XL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)A=A-3W(A)UL(A)COMMITT3SL(A)R(A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-14 T1、T2和和T3上锁操作序列上锁操作序列并发事务封锁举例并发事务封锁举例n 但仍然存在以下问题:但仍然存在以下问题:l不可串行化不可串行化。无论如。无论如何交换非冲
36、突操作,何交换非冲突操作,上述调度都不能等价上述调度都不能等价于于T1、T2和和T3的任何的任何一个串行调度。一个串行调度。出现上述问题的原因出现上述问题的原因是事务是事务过早释放了其过早释放了其持有的锁持有的锁!T1XL(A)等待等待等待等待等待等待R(A)A=A-2W(A)UL(A)ROLLBACKT2XL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)A=A-3W(A)UL(A)COMMITT3SL(A)R(A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤12345678910111213
37、1415161718图图10-14 T1、T2和和T3上锁操作序列上锁操作序列两阶段封锁协议两阶段封锁协议 n 两阶段封锁协议两阶段封锁协议要求每个事务分两个阶段完成封锁操作要求每个事务分两个阶段完成封锁操作:增长增长(申请锁申请锁)阶段和阶段和缩减缩减(释放锁释放锁)阶段:阶段:l增长阶段增长阶段:事务可以获得锁,但不能释放锁;事务可以获得锁,但不能释放锁;l缩减阶段缩减阶段:事务可以释放锁,但不能获得新锁。事务可以释放锁,但不能获得新锁。n 两阶段封锁协议两阶段封锁协议能保证能保证冲突可串行化冲突可串行化。对于任何事务,。对于任何事务,调度中该事务获得其最后加锁的时刻调度中该事务获得其最后
38、加锁的时刻(增长阶段结束点增长阶段结束点)称为称为事务的事务的封锁点封锁点。这样,。这样,多个事务可以根据它们的多个事务可以根据它们的封封锁点锁点进行排序,而这个顺序就是并发事务的一个冲突可进行排序,而这个顺序就是并发事务的一个冲突可串行化顺序串行化顺序。两阶段封锁协议举例两阶段封锁协议举例n 例例10.8 图图10-15采用了两阶段封采用了两阶段封锁,允许事务锁,允许事务T4在在获得全部锁后获得全部锁后(A和和B上的排它锁)提前释放部上的排它锁)提前释放部分锁(如步骤分锁(如步骤7释放了释放了A上的排它上的排它锁),事务锁),事务T5得以提前执行,从得以提前执行,从而提高了事务而提高了事务T
39、4和和T5的并发度。的并发度。T4XL(A)R(A)A=A-2W(A)XL(B)UL(A)R(B)B=B-2W(B)UL(B)T5XL(A)等待等待等待等待等待等待等待等待等待等待R(A)A=A-3W(A)XL(B)等待等待等待等待UL(A)R(B)B=B-3W(B)UL(B)步骤步骤1234567891011121314151617181920图图10-15 T4和和T5的两阶段封锁的两阶段封锁冲突可串行化冲突可串行化,它等价于,它等价于 串行调度。串行调度。两阶段封锁协议存在的问题两阶段封锁协议存在的问题n 问题一:问题一:可能导致死锁可能导致死锁l持有锁事务出现相互等待持有锁事务出现相互
40、等待都不能继续执行。都不能继续执行。T4XL(A)R(A)A=A-2W(A)XL(B)(等待等待T6释放释放B上的排它锁上的排它锁)T6XL(B)R(B)B=B-3W(B)XL(A)(等待等待T4释放释放A上上的排它锁的排它锁)图图10-16 采用两阶段封锁时采用两阶段封锁时T4和和T6出现死锁出现死锁两阶段封锁协议存在的问题两阶段封锁协议存在的问题n 问题二:问题二:不能避免读脏数据不能避免读脏数据(T2读取了读取了T1的未提交的未提交更新结果)更新结果)T1R(A)A=A-2W(A)ROLLBACKT2R(A)A=A-3W(A)T7R(A)A=A-4W(A)图图10-17 由于读脏数据引起
41、的级联回滚由于读脏数据引起的级联回滚 导致的后果是导致的后果是“级联回滚级联回滚”!两阶段封锁协议变体两阶段封锁协议变体n 对于对于级联回滚可以通过将两阶段封锁修改为级联回滚可以通过将两阶段封锁修改为严格两严格两阶段封锁协议阶段封锁协议加以避免加以避免。n 严格两阶段封锁协议严格两阶段封锁协议除了要求封锁是两阶段之外,除了要求封锁是两阶段之外,还要求还要求事务持有的事务持有的所有排它锁所有排它锁必须在必须在事务提交后事务提交后方方可释放可释放。这个要求保证了未提交事务所写的任何数。这个要求保证了未提交事务所写的任何数据在该事务提交之前均以排它方式加锁,防止了其据在该事务提交之前均以排它方式加锁,防止了其他事务读取这些数据。他事务读取这些数据。n 另一个两阶段封锁的变体是另一个两阶段封锁的变体是强两阶段封锁协议强两阶段封锁协议,它,它要求要求事务提交之前事务提交之前不得释放任何锁不得释放任何锁(包括共享锁和排包括共享锁和排它锁它锁)。