数据库上课第十二讲事务处理_第1页
数据库上课第十二讲事务处理_第2页
数据库上课第十二讲事务处理_第3页
数据库上课第十二讲事务处理_第4页
数据库上课第十二讲事务处理_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、机械自动化学院机械自动化学院20152015主讲:主讲: 顾顾 曦曦 电话:电话:1569718107915697181079EmailEmail:主要内容事务事务并发控制并发控制 恢复恢复 *2*31.0 案例飞机订票系统有两个表,分别记录各售票点的售票数(Sale)及剩余票数(Flight): Sale(agentNo, flightNo, date, saledNumber) Flight(flightNo, date, remainNumber)*4现有A0010售票点欲出售F005某航班机票2张张,可编制如下程序: 查询该航班剩余票数A; (1) if (A2) 拒绝操作,并通知票源

2、不足; else 更新A0010售票点的售票数; 更新F005航班的剩余票数;SELECT remainNumber FROM Flight WHERE flightNo=F005 AND date=2015-05-07(2)语句(2)更新包括两个update操作: (1)更新Sale UPDATE Sale SET saledNumber=saledNumber+2 WHERE agentNo=A0010 AND flightNo=F005 AND date=2015-05-07 (2)更新Flight UPDATE Flight SET remainNumber=remainNumber2

3、 WHERE flightNo=F005 AND date=2015-05-07如果第一个如果第一个UPDATE语句执行成功,而第二个语句执行成功,而第二个UPDATE语句执语句执行失败行失败,会发生什么问题?会发生什么问题?假设F005航班共有200个座位,已售198张,A0010售出20张,余票2。第1个UPDATE语句执行成功,即A0010已售票数更新为22时,系统发生故障,未执行第2个UPDATE,总票数仍为198。当重新提供服务时,又有售票点请求出售机票2张,由于剩余票数未更新(仍为2),因此满足其要求又出售了2张。结果多卖了2张票!并发执行并发执行一组在逻辑上互相独立的程序或程序段

4、在执行过程中,其执行时间在客观上互相重叠,即一个程序段的执行尚未结束,另一个程序段的执行已经开始的这种执行方式。目地:充分利用多CPU的优势,提高运行效率,减少客户等待时间。Mysql服务器的多线程方式可以同时处理多个客户端。*8上例中同时有两个客户端请求购买2张票,会发生什么情况?SELECT remainNumber FROM Flight WHERE flightNo=F005 AND date=2008-08-08UPDATE /*更新Sale*/ SET saledNumber=saledNumber+2 WHERE agentNo=A0010 AND flightNo=F005 A

5、ND date=2008-08-08 *9 UPDATE Flight /*更新Flight */ SET remainNumber=remainNumber2 WHERE flightNo=F005 AND date=2008-08-0812如果有两个客户端A、B,数据库可能的执行次序:1)A1,A2,A3,B1,B2,B32)A1,A2,B1,A3,B2,B33)A1,B1,A2,B2,A3,B33*10出现上述问题的原因是什么?出现上述问题的原因是什么?系统提供服务时,系统提供服务时,数据库状态数据库状态与与现实世界状态现实世界状态出现了出现了不一致。不一致。解决思路思路:思路:将这些有

6、内在联系的操作内在联系的操作当作一个逻辑单元一个逻辑单元看待,并采取相应策略保证一个逻辑单元内的全部操作要么要么都执行成功,要么都不执行都执行成功,要么都不执行。方法:方法:数据库管理系统引入了事务概念事务概念,将具有完整逻将具有完整逻辑意义的辑意义的一组操作一组操作定义在定义在一个事务一个事务之内。之内。如上例的如上例的1、2、3程序。程序。1.2 事务概念 对于用户而言,事务是具有完整逻辑意义的数据库操作序列操作序列的集合。对于数据库管理系统而言,事务则是一个读写操作序列。事务结束的两种类型:事务提交(commit):将成功完成事务的执行结果(即更新)永久化,并释放事务占有的全部资源。事务

7、回滚(rollback):中止当前事务、撤销其对数据库所做的更新,并释放事务占有的全部资源。事务定义举例例10.2 显式事务模式定义例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 TRANSAC

8、TION1.3 事务特性(ACID) 为了保证事务并发执行或发生故障时数据的完整性,事务应具有以下特性:原子性原子性(atomicity):事务的所有操作要么全部都被执行,要么都不被执行。一致性一致性(consistency):一个单独执行的事务应保证其执行结果的一致性。隔离性隔离性(isolation):当多个事务并发执行时,一个事务的执行不能影响另一个事务,即并发执行的各个事务不能互相干扰。持久性持久性(durability):一个事务成功提交后,它对数据库的改变必须是永久的,即使随后系统出现故障也不会受到影响。1.4 事务并发执行数据库管理系统允许多个事务并发执行允许多个事务并发执行:优

9、点增加系统吞吐量(throughput)。吞吐量是指单位时间系统完成事务的数量。当一事务需等待磁盘I/O时,CPU可去处理其它正在等待CPU的事务可减少CPU和磁盘空闲时间,增加给定时间内完成事务的数量。减少平均响应时间(average response time)。事务响应时间是指事务从提交给系统到最后完成所需要的时间。事务的执行时间有长有短,如果按事务到达的顺序依次执行,则短短事务事务就可能会由于等待长事务导致完成时间的延长。如果允许并发执行,短事务可以较早地完成。并发执行可减少事务的平均响应时间。事务并发执行缺点若不对事务的并发执行加以控制,则可能破坏数据库的一致性。*16事务并发执行可

10、能出现的问题*17例例10.3 设A航班的剩余票数为10张,有两个事务T1和T2同时请求出售该航班机票2张和3张。它们各自的执行序列如图所示(这里只考虑对航班剩余票数的更新)。 T1R(A)A=A- -2W(A) T2R(A)A=A- -3W(A)更新事务更新事务T1和和T2一些符号R(x):读数据W(x):写数据1.4.1、读脏数据事务T1在T2读取其更新值(8)后回滚T2仍然使用读到T1修改后的值进行运算,得到的结果是5。但实际上T1未执行成功,系统只出售了3张票,余票数应为7。 T1R(A)A=A- -2W(A)rollback T2R(A)A=A- -3W(A)A10885T2读脏数据

11、读脏数据读脏数据脏数据:未提交且被撤销的数据。如果事务T2读取事务T1修改但未提交修改但未提交的数据后,事务T1由于某种原因中止而撤销,这时事务T2就读取了不一致的数据。*191.4.2 不可重复读T3第一次读时余票数为10张T1进行了写操作。第二次读时为8张,两次读结果不一致。 T3R(A)R(A)A101088 T1R(A)A=A- -2W(A)T3不可重复读不可重复读Ti 两次从数据库中读取的结果不同,可分为三种情况:事务Ti读取一数据后,事务Tj对该数据进行了更改。当事务Ti再次读该数据时,则会读到与前一次不同的值。事务Ti按某条件读取数据库中某些记录后,事务Tj删除了其中部分记录。当

12、事务Ti再次按相同条件读取时,发现记录数变少了。(幻影现象1)1.事务Ti按某条件读取数据库中某些记录后,事务Tj插入了新的记录。当事务Ti再次按相同条件读取时,发现记录数变多了。(幻影现象2)1.4.3 丢失更新T1和T2都读到余票数为10,T1后于T2提交T2的更新操作没有发生作用,被T1的更新值(8)覆盖。 T1R(A)A=A- -2W(A) T2R(A)A=A- -3W(A)A1010788T2更新丢失更新丢失 丢失更新两个或多个事务都读取了同一数据值并修改,最后提交事务的执行结果覆盖了覆盖了前面提交事务的执行结果,从而导致前面事务的更新被丢失。 是不是所有并发执行事务都会出现这些问题

13、呢?是不是所有并发执行事务都会出现这些问题呢? 1.4.4 串行执行 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)T1和和T2串行执行串行执行不管是T1先执行再执行T2(图10-2(a),还是T2先执行再执行T1(图10-2(b),都可得到正确的执行结果正确的执行结果,即剩余票数都为5。 启示如果一组并发执行事务的执行结果与它们串行执串行执行行得到的结果是相同的,那么就可以认为该并发并发执行的结果是正确执行的结果是正确的。*251.5 事务调度定义事务并发执行顺序

14、是随机的,将由事务并发执行顺序是随机的,将由多个事务操作多个事务操作组成的组成的随机执行序列随机执行序列称为一个称为一个调度调度。对由一组事务操作组成的调度序列而言,应满足下列条件: 该调度应包括该组事务的全部操作全部操作; 属于同一个事务的操作应保持在原事务中的执行顺序。串行调度定义定义10.1(10.1(串行调度串行调度) ) 在调度S中,如果属于同一事务的操作都是相邻的相邻的,则称S是串行调度串行调度。事务串行执行可保证数据库的一致性。如果能判断一个并发调度并发调度的执行结果的执行结果等价于一个一个串行调串行调度度的结果的结果,就称该并发调度可保证数据库的一致性。冲突操作与冲突等价假设调

15、度S包含两个事务Ti与Tj,若两个相邻操作OiTi,OjTj访问不同的数据对象,则交换Oi与Oj不会影响调度中任何操作的结果。若Oi与Oj访问相同的数据对象,并且有一个为写操作时,则不能改变它们被调度执行的顺序。 定义定义10.210.2 在一调度S中,如果Oi与Oj是不同事务不同事务在相同数据对象相同数据对象上的操作,并且其中至少有一个是写操作写操作,则称Oi与Oj是冲突操作冲突操作;否则称为非冲突操作。定义定义10.310.3 如果一调度S可以经过交换一系列交换一系列非冲非冲突操作突操作执行的顺序执行的顺序而得到一个新的调度S,则称S与S是冲突等价的(conflict equivalent

16、)。*29冲突可串行化 定义定义10.410.4 如果一调度S与一一串行调度串行调度是冲突等价是冲突等价的,则称S是冲突可串行化冲突可串行化的(conflict serializable).*31T4R(A)A=A- -2W(A)R(B)B=B- -2W(B)T5R(A)A=A- -3W(A)R(B)B=B- -3W(B)B15131310A10885T4R(A)A=A-2W(AR(B)B=B-2W(B) T5R(A)A=A-3W(A)R(B)B=B-3W(B)左图的调度中,通过交互非冲突操作可得到右图所示的串行调度,故左图的调度是冲突可串行化的。冲突可串行化冲突可串行化调度执行结果一定是正确

17、的冲突可串行化是正确调度的充分条件,并不是必要条件。正确的调度不一定都需要需要冲突可串行化。T4R(A)A=A- -2W(A)R(B)B=B- -2W(B)T6R(B)B=B- -3W(B)R(A)A=A- -3W(A)B15121210A10885图图10-8 不满足冲突可串行化的正确调度不满足冲突可串行化的正确调度可交换执行顺序吗?Mysql支持事务的引擎InnoDB、NDB、BDB。查看已安装的引擎:mysql SHOW ENGINES;创建支持事务的表()mysqlCREATE TABLE t1 (i int) ENGINE=InnoDB;缺省情况不用写。注意:注意:不是所有语句都能作

18、为事务的一部分;例:DROP DATABASES;*33*342.1 并发控制概述悲观的并发控制方法悲观的并发控制方法数据库的一致性经常会受到破坏,因此在事务访问数据对事务访问数据对象前象前须采取一定措施加以控制,只有得到访问许可时,才能访问数据对象,基于封锁的并发控制方法基于封锁的并发控制方法。乐观的并发控制方法乐观的并发控制方法数据库的一致性通常不会遭到破坏,事务执行时可直接访问数据对象,只在事务结束时事务结束时才验证数据库的一致性是否会遭到破坏,基于有效性验证方法基于有效性验证方法。基于封锁的方法基本思想基本思想当事务T需访问数据对象Q时,先申请对Q的锁。如批准获得,则事务T继续执行,且

19、此后不允许其他任何事务修改Q,直到事务T释放Q上的锁为止。基本锁类型基本锁类型共享锁共享锁(shared lock, 记为S):如果事务T获得了数据对象Q的共享锁,则事务T可读Q但不能写Q。排它锁排它锁(eXclusive lock, 记为X):如果事务T获得了数据对象Q上的排它锁,则事务T既可读Q又可写Q。锁的相容性如果Ti已持有数据对象Q的某类型锁后,事务Tj也申请对Q的封锁。如果允许事务Tj获得对Q的锁,则称事务Tj申请锁类型与事务Ti的持有锁类型相容;否则称为不相容。基本锁类型的封锁相容性原则:相容:共享锁共享锁S与共享锁共享锁S不相容:排它锁排它锁X与共享锁共享锁S、排它锁排它锁X与

20、排它锁排它锁X。X+SXS TiTj图图10-11 基本锁类型的相容性矩阵基本锁类型的相容性矩阵“”表示相容表示相容“”表示不相容表示不相容一些符号申请和释放锁操作:SL(Q):申请数据对象Q上的共享锁;XL(Q):申请数据对象Q上的排它锁;UL(Q):释放数据对象Q上的锁。读写对象R(Q):读取对象W(Q):写入对象*38例10.5单个事务封锁举例 添加了封锁操作XL(A)、XL(B)的事务T4操作序列如图所示。事务在访问完数据对象后立即释放锁*39由于事务T4要对A、B进行读写操作读写操作,因此访问A和B之前都使用XL操作申请排它锁。这样事务T4在释放A(UL(A),或BUL(B)的封锁之

21、前,其他事务不能访问A(或B)。 T4XL(A)R(A)A=A- -2W(A)UL(A)XL(B)R(B)B=B- -2W(B)UL(B)COMMIT T4XL(A)R(A)A=A- -2W(A)UL(A)XL(B)R(B)B=B- -2W(B)UL(B)COMMIT图图10-12 增加了封锁的事务增加了封锁的事务T4操作序列操作序列 封锁能否保证并发执行事务的封锁能否保证并发执行事务的冲突可串行化?冲突可串行化?其他事务在此期间不允许访问其他事务在此期间不允许访问数据对象数据对象A其他事务在此期间不允许访问其他事务在此期间不允许访问数据对象数据对象B 并发事务封锁举例例10.6 考虑并发事务

22、T1、T2和T3,它们申请锁和释放锁的规则是:访问数据对象前根据操作类型申请锁;访问完后立即释放锁;当一个事务释放锁后,由等待时间较长的事务优先获得锁。它们的一个可能的并发执行过程如图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(A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415

23、161718图图10-13 T1、T2和和T3上锁操作序列上锁操作序列该调度存在该调度存在什么问题什么问题?n 该调度该调度避免了丢失更避免了丢失更新新,即,即不会有多个写不会有多个写事务读取同一数据对事务读取同一数据对象的相同值象的相同值,因为一,因为一个数据对象任何时候个数据对象任何时候只能有一个排它锁。只能有一个排它锁。 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)等待等待等待等待

24、等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-13 T1、T2和和T3上锁操作序列上锁操作序列n 仍然存在以下问题:仍然存在以下问题:l读脏数据读脏数据。如。如T2在步在步骤骤11读了读了T1修改后的修改后的数据,而数据,而T1在步骤在步骤12需需ROLLBACK。 T1XL(A)等待等待等待等待等待等待R(A)A=A-2W(A)UL(A)ROLLBACKT2XL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)A=A- -3W(A)UL(A)COMMITT3SL(A)R

25、(A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-13 T1、T2和和T3上锁操作序列上锁操作序列n 存在以下问题:存在以下问题:l不可重复读不可重复读。如。如T3两两次读到次读到A的值不同。的值不同。 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)

26、等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-13 T1、T2和和T3上锁操作序列上锁操作序列n 存在以下问题:存在以下问题:l不可串行化不可串行化。无论如。无论如何交换非冲突操作,何交换非冲突操作,上述调度都不能等价上述调度都不能等价于于T1、T2和和T3的任何的任何一个串行调度。一个串行调度。出现上述问题的原因出现上述问题的原因是事务是事务过早释放了其过早释放了其持有的锁持有的锁! T1XL(A)等待等待等待等待等待等待R(A)A=A-2W(A)UL(A)ROLLBACK

27、T2XL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)A=A- -3W(A)UL(A)COMMITT3SL(A)R(A)UL(A)SL(A)等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待等待R(A)UL(A)COMMIT步骤步骤123456789101112131415161718图图10-13 T1、T2和和T3上锁操作序列上锁操作序列两阶段封锁协议 两阶段封锁协议是由Eswaran等人在1976年提出的。两阶段封锁协议要求每个事务分两个阶段完成封锁操作:增长(申请锁)阶段:事务可以获得锁,但不能释放锁;缩减(释放锁)阶段:事务可以释放锁,但不能获得新锁

28、。两阶段封锁协议能保证冲突可串行化。对于任何事务,调度中该事务获得其最后加锁的时刻(增长阶段结束点)称为事务的封锁点。多个事务可以根据它们的封锁点进行排序,这个顺序就是并发事务的一个冲突可串行化顺序。例: 事务1的封锁序列: SL(A) SL(B)XL(C)UL(C)UL( B )UL( A);遵守两段锁协议*48事务2的封锁序列: SL(A)UL(A)SL( B)X(C)UL(C)UL( B); 没遵守两段协议。增长(申请锁)阶段缩减(释放锁)阶段事务的封锁点例10.7 图10-14采用了两阶段封锁,允许事务T4在获得全部锁后(A和B上的排它锁)提前释放部分锁(如步骤7释放了A上的排它锁),

29、事务T5得以提前执行,从而提高了事务T4和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-14 T4和和T5的两阶段封锁的两阶段封锁冲突可串行化,它等价于冲突可串行化,它等价于 串行调度。串行调度。两阶段封锁协议存在的问题问题一:可能导致死锁持有锁事务出现相互等待都不能继续执行。 T4XL(A

30、)R(A)A=A- -2W(A)XL(B)(等待等待T6释放释放B上的排它锁上的排它锁) T6XL(B)R(B)B=B-3W(B)XL(A)(等待等待T5释放释放A上上的排它锁的排它锁)图图10-15 采用两阶段封锁时采用两阶段封锁时T4和和T6出现死锁出现死锁一次封锁法一次封锁法遵守两段锁协议;一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。解决了死锁问题。但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。*51两阶段封锁协议存在的问题问题二:不能避免读脏数据不能避免读脏数据(T2读取了T1的未提交更新结果) T

31、1R(A)A=A- -2W(A)ROLLBACKT2R(A)A=A-3W(A) T7R(A)A=A- -4W(A)图图10-16 由于读脏数据引起的级联回滚由于读脏数据引起的级联回滚 导致的后果是导致的后果是“级联回滚级联回滚” !UL(A)两阶段封锁协议变体对于级联回滚可以通过将两阶段封锁修改为严格两阶段封锁协议加以避免。严格两阶段封锁协议:严格两阶段封锁协议:事务持有的所有排它锁排它锁必须在事务提交事务提交后方可释放。保证了未提交事务所写的任何数据在该事务提交之前均以排它方式加锁,防止了其他事务读取这些数据防止了其他事务读取这些数据。强两阶段封锁协议:强两阶段封锁协议:事务提交之前不得释放

32、任何锁(包括共享锁和排它锁)。*543.1 故障分类、特征及恢复策略 事务故障事务在运行过程中由于种种原因,如输入数据的错误、运算溢出、违反了某些完整性限制、某些应用程序的错误以及并发事务发生死锁等,使事务未运行至正常终止点就夭折了,这种情况称为事务故障。特征:系统的软件和硬件都能正常运行,内存和磁盘上的数据都未丢失和破坏。恢复策略:强行回滚(ROLLBACK)夭折事务,清除其对数据库的所有修改,使得该事务好象根本没有启动过一样,称这类恢复操作称为事务撤销(UNDO)。 故障分类、特征及恢复策略系统故障该类故障是指系统在运行过程中,由于某种原因,如操作系统或DBMS代码错误、操作员操作失误、特

33、定类型的硬件错误(如CPU故障)、突然停电等造成系统停止运行,致使所有正在运行的事务都以非正常方式终止。特征:数据库缓冲区的信息全部丢失,但存储在外部存储设备上的数据未被破坏。恢复策略UNDO所有未完成事务。 重做(REDO)所有已提交的事务。 故障分类、特征及恢复策略介质故障该类故障是指系统在运行过程中,由于某种硬件故障,如磁盘损坏、磁头碰撞,或操作系统的某种潜在错误,瞬时强磁场干扰等,致使存储在外存中的数据部分丢失或全部丢失。这类故障比前两类故障的可能性小得多,但破坏了磁盘上的数据,危害性最大。特征:存储在外部存储设备上的数据被破坏。恢复策略:需要装入发生介质故障前某个时刻的数据库数据副本

34、,并重做(REDO)自备份相应副本数据库之后的所有成功事务,将这些事务已提交的更新结果重新反映到数据库中去。 故障分类、特征及恢复策略其它故障黑客入侵、病毒、恶意流氓软件等引起的事务异常结束、篡改数据等不一致性。特征:恶意破环。 恢复策略:通过数据库的安全机制、审计机制等实现对数据的授权访问和保护 。小结对于不同类型的故障在恢复时应做不同的恢复处理。恢复的本质是利用存储的冗余数据(如日志、影子、备份副本等)来重建重建数据库中已经被破坏或已经不正确的那部分数据。DBMS中的恢复管理模块由两部分组成:正常事务处理过程中:系统需记录冗余的恢复信息,以保证故障发生后有足够的信息进行数据库恢复;故障发生

35、后:利用冗余信息进行UNDO或REDO等操作,将数据库恢复到一致性状态。 3.2 事务访问数据方式 事务通过三个地址空间同数据库进行交互:操作原语数据元素A在不同地址空间之间移动包括:INPUT(X):将包含数据库记录A的磁盘块X拷贝到数据缓冲区。READ(A):将数据记录A从缓冲区拷贝到事务工作区。如果包含A的磁盘块X不在缓冲区中,则首先执行INPUT(X)操作。WRITE(A):将A的修改值从事务工作区拷贝到缓冲区X块中以替换A的值。如果此时X块不在内存缓冲区中,则应先执行INPUT(X)后再替换。OUTPUT(X):将更新后的X块写回磁盘。*61事务访问数据方式更新磁盘块X中的数据记录A

36、和读磁盘块Y的数据记录B的原语操作过程如图10-17所示。n 注意:注意:READ和和WRITE由由事务事务发出,而发出,而INPUT和和OUTPUT由由缓冲区管理器缓冲区管理器发出。发出。 事务访问数据方式例10.8 考虑机票订票服务,假设某售票点某航班的已售出票数A为0,且该航班剩余票数B为10,则出售2张机票的事务T的逻辑步骤为:A=A+2; B=B-2。数据库的一致性约束为:AB10。假设包含A和B的记录开始分别位于在X和Y磁盘块中,且都不在数据缓冲区中。T的一个可能操作序列为:(1) INPUT(X);(2) READ(A);(3) A=A2;(4) WRITE(A);(5) INP

37、UT(Y);(6) READ(B);(7) B=B- -2(8) WRITE(B);(9) OUPUT(X);(10) OUTPUT(Y)1. 1. 执行完执行完步骤步骤1010后后 ,A A= =?B B= =?A A+ +B B= =? 2. 2. 执行完执行完步骤步骤9 9之前之前发生故障发生故障,A A= =?B B= =? A A+ +B B= =?3. 3. 执行完执行完步骤步骤9 9之后,之后,步骤步骤1010之前之前发生发生故障故障,A A= =? B B= =? A A+ +B B= =? 将磁盘块将磁盘块X从外存读入数据缓冲区从外存读入数据缓冲区X从数据缓冲区从数据缓冲区X

38、读入记录读入记录(数据项数据项)A到事务工作区到事务工作区将事务工作区的记录将事务工作区的记录(数据项数据项)A写回数据缓冲区写回数据缓冲区X将磁盘块将磁盘块Y从外存读入数据缓冲区从外存读入数据缓冲区Y从数据缓冲区从数据缓冲区Y读入记录读入记录(数据项数据项)B到事务工作区到事务工作区将事务工作区的记录将事务工作区的记录(数据项数据项)B写回数据缓冲区写回数据缓冲区Y将数据缓冲区将数据缓冲区X的数据写回磁盘块的数据写回磁盘块X将数据缓冲区将数据缓冲区Y的数据写回磁盘块的数据写回磁盘块Y在事务工作区进行数据更新在事务工作区进行数据更新在事务工作区进行数据更新在事务工作区进行数据更新 A A=2

39、=2 B B=8 =8 A A+ +B B=10 =10 A A=0 =0 B B=10 =10 A A+ +B B=10 =10 A A=2 =2 B B=10 =10 A A+ +B B=12 =12 3.3 基于日志的故障恢复策略 日志是DBMS记录数据库全部更新操作的序列文件。主要特点有:日志文件记录了数据库的全部更新顺序。日志文件是一个追加(append-only)文件。DBMS允许事务的并发执行导致日志文件是“交错的”。属于单个事务的日志顺序与该事务更新操作的执行顺序是一致的。日志记录通常是先写到日志缓冲区中,然后写到稳固存储器(如磁盘阵列)中。日志记录类型两种类型:记录数据更新操

40、作包括UPDATE、INSERT和DELETE操作;记录事务操作包括START、COMMIT和ABORT操作。日志记录格式表示事务Ti对数据元素A执行了更新操作,V1表示A更新前的值(前映像), V2表示A更新后的值(后映像)。对于插入操作,V1为空;对于删除操作,V2为空。表示事务Ti已经开始。表示事务Ti已经提交,即事务Ti已经执行成功(该事务对数据库的修改必须永久化)。表示事务已经中止,即事务执行失败。此时,如果Ti所做的更新已反映到磁盘上,DBMS必须消除Ti对磁盘数据库的影响。先写日志(write-ahead)规则 为了保证数据库能运用日志进行恢复,要求日志文件必须放到稳固存储器稳固存储器(如磁盘阵列如磁盘阵列)上,每条日志记录必须在其所包含数据记录的更新值写到外存储器之前前先写到稳固存储器上。 UNDO操作日志中记录有以及T对数据库的所有更新操作的日志记录。UNDO过程为:从T的最后一条更新日志记录开始,从日志尾向日志头(反向)依次将T更新的数据元素值恢复为旧值(V1)。如果增加一条规则:T对数据库的所有更新值在日志写到磁盘前不能写到磁盘。这样,如果没有看到事务T 的日志记录,就可以确定T的更新值一定没有写到磁盘,从而可避免UNDO操作。REDO操作与UNDO相反,REDO操作是对已提交事

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论