您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 数据库上课第十二讲事务处理.
机械自动化学院2015主讲:顾曦电话:15697181079Email:guxi@live.com数据库系统原理与设计主要内容1.事务2.并发控制3.恢复13:45213:4531.0案例飞机订票系统有两个表,分别记录各售票点的售票数(Sale)及剩余票数(Flight):Sale(agentNo,flightNo,date,saledNumber)Flight(flightNo,date,remainNumber)13:454现有A0010售票点欲出售F005某航班机票2张,可编制如下程序:查询该航班剩余票数A;(1)if(A2)拒绝操作,并通知票源不足;else更新A0010售票点的售票数;更新F005航班的剩余票数;SELECTremainNumberFROMFlightWHEREflightNo=‘F005’ANDdate=‘2015-05-07’(2)语句(2)更新包括两个update操作:(1)更新SaleUPDATESaleSETsaledNumber=saledNumber+2WHEREagentNo=‘A0010’ANDflightNo=‘F005’ANDdate=‘2015-05-07’(2)更新FlightUPDATEFlightSETremainNumber=remainNumber–2WHEREflightNo=‘F005’ANDdate=‘2015-05-07’如果第一个UPDATE语句执行成功,而第二个UPDATE语句执行失败,会发生什么问题???假设F005航班共有200个座位,已售198张,A0010售出20张,余票2。第1个UPDATE语句执行成功,即A0010已售票数更新为22时,系统发生故障,未执行第2个UPDATE,总票数仍为198。当重新提供服务时,又有售票点请求出售机票2张,由于剩余票数未更新(仍为2),因此满足其要求又出售了2张。结果多卖了2张票!并发执行并发执行一组在逻辑上互相独立的程序或程序段在执行过程中,其执行时间在客观上互相重叠,即一个程序段的执行尚未结束,另一个程序段的执行已经开始的这种执行方式。目地:充分利用多CPU的优势,提高运行效率,减少客户等待时间。Mysql服务器的多线程方式可以同时处理多个客户端。13:458上例中同时有两个客户端请求购买2张票,会发生什么情况?SELECTremainNumberFROMFlightWHEREflightNo=‘F005’ANDdate=‘2008-08-08’UPDATE/*更新Sale*/SETsaledNumber=saledNumber+2WHEREagentNo=‘A0010’ANDflightNo=‘F005’ANDdate=‘2008-08-08’13:459UPDATEFlight/*更新Flight*/SETremainNumber=remainNumber–2WHEREflightNo=‘F005’ANDdate=‘2008-08-08’12如果有两个客户端A、B,数据库可能的执行次序:1)A1,A2,A3,B1,B2,B32)A1,A2,B1,A3,B2,B33)A1,B1,A2,B2,A3,B3313:4510出现上述问题的原因是什么?系统提供服务时,数据库状态与现实世界状态出现了不一致。解决思路思路:将这些有内在联系的操作当作一个逻辑单元看待,并采取相应策略保证一个逻辑单元内的全部操作要么都执行成功,要么都不执行。方法:数据库管理系统引入了事务概念,将具有完整逻辑意义的一组操作定义在一个事务之内。如上例的1、2、3程序。1.2事务概念对于用户而言,事务是具有完整逻辑意义的数据库操作序列的集合。对于数据库管理系统而言,事务则是一个读写操作序列。事务结束的两种类型:事务提交(commit):将成功完成事务的执行结果(即更新)永久化,并释放事务占有的全部资源。事务回滚(rollback):中止当前事务、撤销其对数据库所做的更新,并释放事务占有的全部资源。事务定义举例[例10.2]显式事务模式定义例10.1中的数据库更新事务。BEGINTRANSACTIONUPDATESaleSETsaledNumber=saledNumber+2WHEREagentNo=‘A0010’ANDflightNo=‘F005’ANDdate=‘2008-08-08’UPDATEFlightSETremainNumber=remainNumber-2WHEREflightNo=‘F005’ANDdate=‘2008-08-08’COMMITTRANSACTION1.3事务特性(ACID)为了保证事务并发执行或发生故障时数据的完整性,事务应具有以下特性:原子性(atomicity):事务的所有操作要么全部都被执行,要么都不被执行。一致性(consistency):一个单独执行的事务应保证其执行结果的一致性。隔离性(isolation):当多个事务并发执行时,一个事务的执行不能影响另一个事务,即并发执行的各个事务不能互相干扰。持久性(durability):一个事务成功提交后,它对数据库的改变必须是永久的,即使随后系统出现故障也不会受到影响。1.4事务并发执行数据库管理系统允许多个事务并发执行:优点增加系统吞吐量(throughput)。吞吐量是指单位时间系统完成事务的数量。当一事务需等待磁盘I/O时,CPU可去处理其它正在等待CPU的事务可减少CPU和磁盘空闲时间,增加给定时间内完成事务的数量。减少平均响应时间(averageresponsetime)。事务响应时间是指事务从提交给系统到最后完成所需要的时间。事务的执行时间有长有短,如果按事务到达的顺序依次执行,则短事务就可能会由于等待长事务导致完成时间的延长。如果允许并发执行,短事务可以较早地完成。并发执行可减少事务的平均响应时间。事务并发执行缺点若不对事务的并发执行加以控制,则可能破坏数据库的一致性。13:4516事务并发执行可能出现的问题13:4517[例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)rollbackT2R(A)A=A-3W(A)A10885T2读脏数据读脏数据脏数据:未提交且被撤销的数据。如果事务T2读取事务T1修改但未提交的数据后,事务T1由于某种原因中止而撤销,这时事务T2就读取了不一致的数据。13:45191.4.2不可重复读T3第一次读时余票数为10张T1进行了写操作。第二次读时为8张,两次读结果不一致。T3R(A)R(A)A101088T1R(A)A=A-2W(A)T3不可重复读Ti两次从数据库中读取的结果不同,可分为三种情况:1.事务Ti读取一数据后,事务Tj对该数据进行了更改。当事务Ti再次读该数据时,则会读到与前一次不同的值。2.事务Ti按某条件读取数据库中某些记录后,事务Tj删除了其中部分记录。当事务Ti再次按相同条件读取时,发现记录数变少了。(幻影现象1)3.事务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更新丢失丢失更新两个或多个事务都读取了同一数据值并修改,最后提交事务的执行结果覆盖了前面提交事务的执行结果,从而导致前面事务的更新被丢失。是不是所有并发执行事务都会出现这些问题呢?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)A10885A10775(a)(b)T1和T2串行执行不管是T1先执行再执行T2(图10-2(a)),还是T2先执行再执行T1(图10-2(b)),都可得到正确的执行结果,即剩余票数都为5。启示如果一组并发执行事务的执行结果与它们串行执行得到的结果是相同的,那么就可以认为该并发执行的结果是正确的。13:45251.5事务调度定义事务并发执行顺序是随机的,将由多个事务操作组成的随机执行序列称为一个调度。对由一组事务操作组成的调度序列而言,应满足下列条件:该调度应包括该组事务的全部操作;属于同一个事务的操作应保持在原事务中的执行顺序。串行调度定义10.1(串行调度)在调度S中,如果属于同一事务的操作都是相邻的,则称S是串行调度。事务串行执行可保证数据库的一致性。如果能判断一个并发调度的执行结果等价于一个串行调度的结果,就称该并发调度可保证数据库的一致性。冲突操作与冲突等价假设调度S包含两个事务Ti与Tj,若两个相邻操作OiTi,OjTj访问不同的数据对象,则交换Oi与Oj不会影响调度中任何操作的结果。若Oi与Oj访问相同的数据对象,并且有一个为写操作时,则不能改变它们被调度执行的顺序。定义10.2在一调度S中,如果Oi与Oj是不同事务在相同数据对象上的操作,并且其中至少有一个是写操作,则称Oi与Oj是冲突操作;否则称为非冲突操作。定义10.3如果一调度S可以经过交换一系列非冲突操作执行的顺序而得到一个新的调度S’,则称S与S’是冲突等价的(conflictequivalent)。13:4529冲突可串行化定义10.4如果一调度S与一串行调度是冲突等价的,则称S是冲突可串行化的(conflictserializable).13:4531T4R(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)左图的调度中,通过交互非冲突操作可得到右图所示的串行调度T4,T5,故左图的调度是冲突可串行化的。冲突可串行化冲突可串行化调度执行结果一定是正确的冲突可串行化是正确调度的充分条件,并不是必要条件。正确的调度不一定都需要冲突可串行化。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。查看已安装的引擎:mysqlSHOWENGINES;创建支持事务的表()mysqlCREATETABLEt1(iint)ENGINE=InnoDB;缺省情况不用写。注意:不是所有语句都能作为事务的一部分;例:DROPDATABASES;13:453313:45342.1并发控制概述悲观的并发控制方法数据库的一致性经常会受到破坏,因此在事务访问数据对象前须采取一定措施加以控制,只有得到访问许可时,才能访问数据对象,基于封锁的并发控制方法。乐观的并发控制方法数据库的一致性通常不会遭到破坏,事务执行时可直接访问数据对象,只在事务结束时才验证数据库的一致性是否会遭到破坏,基于有效性验证方法。基于封锁的方法基本思想当事务T需访问数据对象Q时,先申请对Q的锁。如批准获得,则事务T继续执行,且此后不允许其他任何事务修改Q,直到事务T释放Q上的锁为止。基本锁类型共享锁(sharedlock,记为S):如
本文标题:数据库上课第十二讲事务处理.
链接地址:https://www.777doc.com/doc-2332532 .html