您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 数据库技术基础chp6
数据库技术基础第6章事务管理第6章事务管理6.1学习目标6.2事务的概念6.3恢复技术6.4并发控制6.5小结6.1学习目标学完本章后,读者应具备以下能力:理解事务的概念,掌握定义事务的方法。理解事务的ACID特性。理解并发控制的必要性,了解实现并发控制的封锁技术。基本掌握数据库备份和恢复的原理。第6章事务管理6.1学习目标6.2事务的概念6.3恢复技术6.4并发控制6.5小结6.2事务的概念事务由一系列的对数据库的查询操作和更新操作构成,这些操作是一个整体,不能分割,即要么所有的操作都顺利完成,要么一个操作也不要做,绝不能只完成了部分操作,而还有一些操作没有完成。事务是数据库运行中的一个逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。6.2.1定义事务的SQL语句[例6.1]假设在银行应用中,需要将用户A的账户中的1万元转移到用户B的账户上。这个应用由两个操作组成,一是从用户A的账户扣除1万元,二是在用户B的账户上增加1万元,可以用两个UPDATE语句实现。根据银行的业务规则,增加1万元和减少1万元这两个操作要么全做,要么一个也不要做,所以要把这两个操作定义成一个事务。假设所有用户的存款余额保存在表Account中,属性Balance表示每个账户的余额,CID是用户的标识,完成该应用的T-SQL语句如下:Declare@A_BalanceINT--声明变量BEGINTRANSACTION--显式定义事务的开始UPDATEAccountSETBalance=Balance+10000--①给B的账户增加1万元WHERECID='B'SELECT@A_Balabce=Balance--②取出A账户的余额FROMAccountWHERECID='A'IF@A_Balance10000--③判断A账户的余额ROLLBACK④--余额小于1万,撤销ELSE--⑤余额大于1万,A账户减少1万BEGINUPDATEAccountSETBalance=Balance-10000WHERECID='A'COMMIT--⑥提交事务END6.2.1定义事务的SQL语句(续)定义事务的开始•自动提交事务:每条单独的语句都是一个事务,语句执行成功则提交,否则就回滚事务。这是SQLServer的默认工作方式。•显式事务:每个事务均以BEGINTRANSACTION语句显式开始,以COMMIT或ROLLBACK语句显式结束。•隐性事务:在前一个事务完成时新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK语句显式完成。SETIMPLICIT_TRANSACTIONSON命令使SQLServer启用隐性事务模式,SETIMPLICIT_TRANSACTIONSOFF将SQLServer恢复成自动提交事务模式。一般情况下,一条DDL语句(例如CREATETABLE)和DCL语句(GRANT)构成一个事务。6.2.1定义事务的SQL语句(续)定义事务的结束提交语句•格式:COMMIT[WORK]•功能:表示一个事务的正常结束。该语句成功执行后,DBMS将事务对数据库的操作保存到数据库中。撤销语句(回滚语句)•格式:ROLLBACK[WORK]•功能:表示一个事务的非正常结束。该语句执行后,DBMS将撤销事务对数据库的所有操作,把数据库恢复到事务执行前的状态。6.2.1定义事务的SQL语句(续)6.2.2事务的特性原子性(Atomicity)一个事务中的所有操作,是一个逻辑上不可分割的单位。从效果上看,这些操作要么全部执行,要么一个也不执行。一致性(Consistency)数据库处于一个一致性状态是指数据库中的数据满足各种完整性约束。隔离性(Isolation)是指无论同时有多少事务在执行,DBMS会保证事务之间互不干扰,同一时刻就像只有一个事务在运行一样。持久性(Durability)第6章事务管理6.1学习目标6.2事务的概念6.3恢复技术6.4并发控制6.5小结6.3恢复技术DBMS不断地执行事务来完成对数据库的查询操作和更新操作,将数据库从一个一致性状态带到了另一个一致性状态。但是由于多种原因会破坏数据库中数据的正确性,DBMS必须采用技术手段保证数据库中数据的安全性和一致性。DBMS的恢复子系统采取保存冗余数据,在必要的时候撤销(UNDO)或重做(REDO)一个或多个事务,使得数据库始终处于一致性状态。6.3.1故障种类DBMS在内存开辟了系统缓冲区,用于临时存放从数据库读出的数据和要写回数据库的数据,并给每个事务在内存中建立各自的工作区。②DB系统缓冲区T1工作区T2工作区内存②①①图6.1数据的流动事务故障事务在运行过程中,如果出现运算溢出,违反了某些完整性规则,某些应用程序的错误,或并发事务发生死锁等,使事务不能继续执行下去。系统故障系统在运行过程中,由于某种原因,如操作系统或DBMS代码错误,操作员操作失误、特定类型的硬件错误(如CPU故障)、突然停电等造成系统停止运行,丢失了系统缓冲区中的数据,而存储在磁盘中的数据未受到影响。6.3.1故障种类介质故障系统在运行过程中,由于某种硬件故障,如磁盘坏损,磁头碰撞、或由于操作系统的某种潜在的错误、瞬时强磁场干扰,使存储在外存上的数据部分损失或全部损失。6.3.1故障种类6.3.2应对措施日志文件事务由一系列对数据库的读写操作组成,按照操作执行的先后次序,记录下事务对数据库的所执行的所有写操作(更新操作),就构成了事务的日志文件。日志文件的格式和内容:•事务标识(标明是哪个事务)•操作的类型(插入、删除或更新)•操作对象(记录内部标识)•更新前数据的旧值(对插入操作而言,此项为空值)•更新后数据的新值(对删除操作而言,此项为空值)T1UABB120011200(b)(a)BeginUpdateRollbackBeginUpdateCommitUpdate图6.2事务日志文件示意图6.3.2应对措施(续)登记日志文件日志文件为数据库的数据建立了副本(冗余),为了保证数据库数据的可恢复性,必须坚持先写日志,后写数据的原则。数据库系统缓冲区T1工作区T2工作区内存①②日志③图6.3先写日志后写数据库6.3.2应对措施(续)数据库备份制做备份的过程称为转储。转储可以分为增量转储和海量转储。•海量转储是指每次转储全部数据。•增量转储是指每次转储上次转储后修改过的数据。转储还可分为静态转储和动态转储。•静态转储是指系统停止对外服务,不允许用户运行事务,只进行转储操作。•动态转储是指转储期间允许用户对数据库进行存取操作,即转储和用户事务可以并发执行。6.3.2应对措施(续)6.3.3恢复过程事务故障恢复具体做法是:反向阅读日志文件,找出该事务的所有更新操作,执行每一个更新操作的逆操作系统故障恢复根据日志文件建立重作队列和撤销队列。对UNDO队列中的事务进行UNDO处理,对REDO队列中事务的进行REDO处理。•进行UNDO处理的方法是,从UNDO队列中取出一个事务,反向扫描日志文件,对该事务的更新操作执行逆操作,直至处理完UNDO队列中的所有事务。•进行REDO处理的方法是,从REDO队列中取出一个事务,正向扫描日志文件,对该事务的更新操作重新执行,直至处理完REDO队列中的所有事务。6.3.3恢复过程(续)介质故障的恢复重装转储的数据库副本,使数据库恢复到转储时的一致状态。装入转储后备份的第一个日志文件•读日志文件,找出已提交的事务,按提交次序的先后将其记入REDO队列。•重做REDO队列中每个事务的所有更新操作。装入下一个日志文件重复上一步,直至处理完所有的日志文件,这时数据库恢复至故障前某一时刻的一致状态。第6章事务管理6.1学习目标6.2事务的概念6.3恢复技术6.4并发控制6.5小结6.4并发控制DBMS为了有效地利用计算机的硬件资源和数据库中的数据,允许多个事务并发执行,但事务的并发执行可能出现诸如丢失更新、读脏数据、不可重复读问题,使数据库处于不一致性的状态。为了防止并发执行产生的问题,DBMS需要具备并发控制的功能。并发控制常用的方法有封锁法、时间印法和乐观控制法。商用的DBMS一般都采用封锁法。调度就是对到达调度程序的读写操作重新安排它们的执行次序,而不是先来先服务。READ(X),WRITE(X)LOCK(X),READ(X),WRITE(X),UNLOCK(X)READ(X),WRITE(X),COMMIT(T),ROLLBACK(T)事务管理器调度程序第一部分DB调度程序第二部分锁表图6.5并发控制6.4并发控制6.4.1并发带来的问题[例6.2]有两个转账事务,事务T1将账户A中的余额减少100元,将账户B中的余额增加100元。事务T2将账户B的余额减少50元,将账户A的金额增加50元。假设事务开始时账户A的余额是260元,账户B的余额是1000元。数据库中定义的完整性限制是借贷平衡,简单的说就是一个账户增加了一定数量的钱,另外的账户必须减少等量的钱。将两个事务用读操作R(x)和写操作W(x)表示如下:T1=R1(A)W1(A)R1(B)W1(B)T2=R2(B)W2(B)R2(A)W2(A)(1)并发执行一执行过程如图6.6(a)所示,操作按照从上往下的次序执行。执行的结果是账户A的余额是210元,账户B的余额是1100。如果先执行T1,再执行T2,或者先执行T2,再执行T1,最终账户A的余额是210,账户B的余额是1050。事务T2虽然执行了从账户B减少50元的操作,但它并没有发挥其作用。这种现象称为“丢失更新”。开始时A=260B=1000T1T2R(A=260)W(A=160)R(B=1000)R(B=1000)W(B=950)R(A=160)W(A=210)W(B=1100)结束时A=210B=1100(a)图6.6三种并发执行过程6.4.1并发带来的问题(续)(2)并发执行二执行过程如图6.6(b)所示。在本次执行中事务T2更新了账户B,之后由于某种原因被撤销,只有T1完成了所有操作,因此,正确的结果应该是账户A的余额是160,账户B的余额是1100。执行结果是账户A的余额为160,账户B的余额是1050。出错的原因在于T1读了T2撤销前的中间执行结果950元,并在这个结果上增加了100元。这种现象叫做“读脏数据”。开始时A=260B=1000T1T2R(B=1000)W(B=950)R(A=260)W(A=160)R(B=950)ROLLBACKW(B=1050)结束时A=160B=1050(b)图6.6三种并发执行过程6.4.1并发带来的问题(续)(3)并发执行三执行过程如图6.6(c)所示。T1在执行过程中读了两次账户B,但是发现B的两次余额不一样,由于不知道发生了什么情况而将T1撤销了。在这次执行中事务T1第一次读账户B的余额为1000元,第二次读的余额为950元,对同一个数据两次读的结果不一样,原因是在两个读操作中间执行了另外的事务T2。这种现象叫做“不可重复读”。开始时A=260B=1000T1T2R(A=260)W(A=160)R(B=1000)R(B=1000)W(B=950)R(B=950)ROLLBACKR(A=260)W(A=310)结束时A=310B=950(C)图6.6三种并发执行过程6.4.1并发带来的问题(续)[例6.3]假设账户A、B和C的初始余额分别是260元、1000元和300元。有三个转账事务,事务T1从账户A转账100元到账户B,事务T2从账户B转账50元到账户A,事务T3从账户A转账60元到账户C。三个事务可以表示为:T1=R1(A)W1(A)R1(B)W1(B)T2=R2(B)W2(B)R2(A)W2(A)T3=R3(A)W3(A)R3(C)W3(C)三个事务如果串行执行,别执行结果使账户A、B和C的余额分别为150元、1050元和360元。表6.1所示的调度显然不是串行调度(T2和T3的操作交叉进行),得到的结果确与串行执
本文标题:数据库技术基础chp6
链接地址:https://www.777doc.com/doc-3414527 .html