《数据库原理及应用开发技术_事务管理6(ppt).ppt》由会员分享,可在线阅读,更多相关《数据库原理及应用开发技术_事务管理6(ppt).ppt(56页珍藏版)》请在三一办公上搜索。
1、讲义六:事务管理,主要内容,事务的概念恢复措施并发控制小结,6.1 事务的概念,事务:构成单一逻辑工作单元的操作的集合事务是由一系列的对数据库的查询操作和更新操作构成,这些操作是一个整体,不能分割。事务要么所有的操作都顺利完成,要么一个操作也不要做,绝不能只完成了部分操作,而还有一些操作没有完成。DBMS中的事务管理子系统负责事务的处理,(1)原子性(Atomicity)一个事务中的所有操作,是一个逻辑上不可分割的单位。(2)一致性(Consistency)数据库处于一个一致性状态是指数据库中的数据满足各种完整性约束。,1 事务的特性,(3)隔离性(Isolation)隔离性的含义是指无论同时
2、有多少事务在执行,DBMS会保证事务之间互不干扰,就像只有一个事务在运行一样。(4)持久性(Durability)DBMS的恢复子系统采用日志和备份技术保证事务的持久性。事务的这四个特性一般简称为事务的ACID特性。,1 事务的特性,(1)启动事务:BEGIN TRANSACTION(2)提交事务 COMMIT TRANSACTION(3)回滚语句 ROLLBACK TRANSACTION,2 事务的语句,例 在运输部门的订票数据库一个完整事务:-开始事务:(1)查询某趟车次TrainNo的剩余车票(2)插入订票记录ReservedTicket(3)更新剩余票额Ticket的数量-提交事务,3
3、 事务举例,Select TSum=TicketSum-取出剩余车票数量From TrainTicketWhere TrainNo=D123;IF TSum=0-没有剩余车票ROLLBACK TRANSACTION-回滚事务ELSEBEGIN TRANSACTIONINSERT INTO ReservedTicket values(“车次”,“发站”,“到站”,“座位号”,“票价”,”日期”,);UPDATE TrainTicket SET TicketSum=TicketSum 1where TicketNo=D123;COMMIT TRANSACTION-提交事务 END,3 事务举例,4
4、 事务状态,事务必须处于下列状态之一活动状态:初始状态;事务执行时处于这个状态部分提交状态:最后一条语句执行后失败状态:发现正常的执行不能继续之后中止状态:事务回滚并且数据库已恢复到事务开始执行前的状态之后提交状态:成功完成后,6.2 事务恢复,DBMS中的数据如何流动的:,图:数据的流动,标号和的流程分别是读操作和写操作的数据流动过程。,6.2 事务恢复,恢复机制:1.数据库系统必不可少的组成部分,负责将数据库恢复到故障发生前的某个一致的状态。2.高可用性:尽快恢复数据库功能,使崩溃的数据库不能使用的时间减少到最小。,(1)事务故障 事务在运行过程中,如果出现运算溢出,违反了某些完整性规则,
5、某些应用程序的错误,以及并发事务发生死锁等,使事务不能继续执行下去,这种情况称为事务故障。非法输入;溢出或超出资源限制等,1 故障种类,(2)系统故障 系统故障是指系统在运行过程中,由于某种原因,如操作系统或DBMS代码错误,操作员操作失误、特定类型的硬件错误(如CPU故障)、突然停电等造成系统停止运行,丢失了系统缓冲区中的数据,而存储在磁盘中的数据未受到影响。,1 故障种类,(3)介质故障 系统在运行过程中,由于某种硬件故障,如磁盘坏损,磁头碰撞、或由于操作系统的某种潜在的错误、瞬时强磁场干扰,使存储在外存上的数据部分损失或全部损失,称为介质故障。这类故障比前两类故障的可能性小的多,但破坏性
6、最大,所有正在运行的事务被中止,系统缓冲区中的数据无法写到磁盘,存储在磁盘上的数据全部丢失!,1 故障种类,2 恢复措施,(1)日志文件 事务由一系列对数据库的读写操作组成,按照操作执行的先后次序,记录下事务所执行的所有对数据库的写操作(更新操作),就构成了事务的日志文件。日志文件的格式和内容日志文件从逻辑上来看是由若干条记录构成的,这些记录叫做日志记录,同一个事务的日志记录组织成了一个链表。,日志文件示意图,2 恢复措施,日志文件示意图 在图中,图(a)为向一个表中插入一条记录,出错了,则终止事物执行。图(b)中给出Update记录的内部结构,T1表示发出操作的是事务T1,U表示操作类型是修
7、改(Update),Ticket(TicketSum)表示修改的数据对象是TrainTicket表的TicketSum列,修改前的值是80,修改后的值是79。,2 恢复措施,日志文件记录日志文件由若干记录组成,记录有三种类型,一是记录事务的开始,用Begin表示,主要记录事务的内部标识和开始时间;二是记录事务的结束,图中用Rollback和Commit表示,主要记录事务的内部标识和结束时间;三是记录事务的更新操作。,2 恢复措施,日志文件记录信息 其中事务的更新操作用Update表示,更新要记录以下的信息:1.事务标识(标明是哪个事务)2.操作的类型(插入、删除或修改)3.操作对象(记录内部标
8、识)4.更新前数据的旧值(对插入操作而言,此项为空值)5.更新后数据的新值(对删除操作而言,此项为空值),2 恢复措施,(2)登记日志文件 日志文件为数据库的数据建立了副本(冗余),为了保证数据库数据的可恢复性,必须坚持先写日志,后写数据的原则。事务更新了某个数据后,把数据由工作区复制到系统缓冲区,同时形成了一条日志记录,该日志记录也被存放到系统缓冲区。DBMS保证,把更新后的数据由系统缓冲区移动到数据库之前,要首先把相应的日志记录写到日志文件中,这叫做先写日志规则。,2 恢复措施,(3)登记日志文件步骤第一步,事务把更新后的数据和形成的日志记录写到系统缓冲区。第二步,将日志记录写到磁盘上的日
9、志文件。第三步,把更新后的数据写到数据库。,2 恢复措施,(4)数据库备份 为了处理介质故障,需要由DBA定期地将数据库和日志文件复制到磁带或磁盘上,并将这些备用的数据文本妥善地保存起来,当数据库遭到破坏时就可以将后备副本重新装入,恢复数据库。,2 恢复措施,(4)数据库备份 制做备份的过程称为转储。转储是十分耗费时间和资源的,不能频繁进行。DBA应根据应用情况确定适当的转储时间和周期。转储可以分为增量转储和海量转储。海量转储是指每次转储全部数据库,而增量转储是指每次转储上次转储后修改过的数据。转储还可分为静态转储和动态转储。静态转储是指系统停止对外服务,不允许用户运行事务,只进行转储操作。动
10、态转储是指转储期间允许用户对数据库进行存取操作,即转储和用户事务可以并发执行。,2 恢复措施,(5)故障恢复事务故障恢复事务未运行至正常终止点前被DBMS或用户撤消,这时恢复子系统对此事务做UNDO处理。具体做法:反向阅读日志文件,找出该事务的所有更新操作,对每一个更新操作做它的逆操作。即若记录中是插入操作,则做删除操作。若记录中是删除操作,则做插入操作,若是修改操作,则用修改前的值代替修改后的值。如此处理直至读到此事务的开始标签,事务故障恢复完成。,2 恢复措施,(5)故障恢复系统故障恢复造成数据库不一致状态的原因有两个,一是由于一些未完成事务对数据库的更新已写入数据库,二是由于一些已提交事
11、务对数据库的更新还留在缓冲区没来得及写入数据库。系统故障恢复是在系统重新启动以后进行的。基本的恢复算法分为二步:1.根据日志文件建立重作队列和撤消队列 2.对UNDO队列中的事务进行UNDO处理,对REDO队列中事务的进行REDO处理。,2 恢复措施,(5)故障恢复介质故障恢复 在发生介质故障时,磁盘上的物理数据库被破坏,因此,需要重装最后一次备份的数据库备份,但重装副本只能将数据库恢复到转储时的状态。从那以后的所有更新事务必须重新运行才能恢复到故障时的状态。,2 恢复措施,(6)恢复过程示例举例:系统在t1时刻停止运行事务,进行数据库转储,在t2时刻转储完毕,得到t2时刻的数据库的一致性副本
12、。当系统运行到tn时刻发生故障。,运行事务介质故障恢复过程,t1,t2,tn,故障点,转储完毕,转储开始,2 恢复措施,(6)恢复过程示例 重装转储的数据库副本,使数据库恢复到转储时的一致状态。装入转储后备份的第一个日志文件 读日志文件,找出已提交的事务,按提交次序的先后将其记入REDO队列。重做REDO队列中每个事务的所有更新操作。装入下一个日志文件重复上一步,直至处理完所有的日志文件,这时数据库恢复至故障前一时刻的一致状态。,2 恢复措施,6.3 并发控制,DBMS为了有效的利用计算机的硬件资源和数据库中的数据,允许多个事务并发执行,但事务的并发执行可能出现诸如丢失修改、读脏数据、不可重复
13、读问题,使数据库处于不一致性的状态。为了防止并发执行产生的问题,DBMS需要具备并发控制的功能。并发控制常用的方法有封锁法、时间印法和乐观控制法,商用的DBMS一般都采用封锁法。并发控制由DBMS中的调度器、事务管理器以及存储子系统协同完成并发控制,6.3 并发控制,并发控制示意图,作用:实现可串行化调度采用串行调度来保证数据库处于一致性状态本节中对数据库的操作用更底层的读操作和写操作来描述并发控制。用R(x)表示对数据x的读操作W(x)表示对数据x的写操作,一个事务由若干的读操作和写操作组成。SQL中的SELECT语句可以用一串读操作表示,INSERT语句可以用一串写操作表示,UPDATE和
14、DELETE可以用一串读写操作表示。,6.3 并发控制,举例:假设有两个售票员同时运行售票的事务,分别用T1和T2表示。事务用底层操作可以表示为:W(A)R(B)W(B)-W(A)表示向ReservedTicket表插入一个元组;-R(B)和W(B)表示读、写Ticket表的TicketSum列,因为一个UPDATE语句首先要读出TicketSum上的值,然后才能做加1运算,所以,UPDATE语句要使用两个底层操作。,1 并发产生的问题,并发执行一:,在t1、t2和t3时刻售票1的事务的三个操作被送到DBMS的存取层,并立刻获得执行,在t4、t5和t6时刻执行售票2的三个操作,执行的结果和我们
15、预期的结果完全相同,如右图所示。两个事务的执行是实际上是串行执行,先执行完T1,再执行T2。,1 并发产生的问题,并发执行二:,如右图所示,T1和T2的操作穿插执行,结果是T1的修改操作没有起到应有的作用,这种现象称为“丢失修改”。,1 并发产生的问题,并发执行三:,售票1执行事务T1,但是在确认是否真正买票时,他放弃了买票,事务被回滚。具体的执行过程如右图所示,T2的售票操作也没有获得成功,原因是在T1没有结束时,就读了ticketsum,这种现象叫做“读脏数据”。,1 并发产生的问题,并发执行四:,T1在执行过程中读了两次ticketsum,但是发现ticketsum的两次余额不一样,由于
16、不知道发生了什么情况而将T1撤消了。原因是在两个读操作中间执行了另外的事务T2,这种现象叫做“不可重复读”。,1 并发产生的问题,2 锁,类型:S锁和X锁 S锁又被称为共享锁(Share Locks),X锁又被叫做排它锁(eXclusive Locks)。共享锁又称为读锁:若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其它事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。,(2)排它锁 排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到
17、T释放A上的锁。这就保证了其它事务在T释放A上的锁之前不能读取和修改A。,封锁类型的相容矩阵,Y=Yes,相容的请求N=No,不相容的请求,2 锁,封锁级别对数据对象加锁所采用的规则。一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。可防止:丢失修改不能防止:可重复读和不读“脏”数据。,2 锁,封锁级别:二级封锁协议:实施一级封锁协议,并且事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议除防止了丢失修改,还可进一步防止读“脏”数据,由于读完数据后即可释放S锁,所以它不能保证可重
18、复读。,2 锁,封锁级别三级封锁协议:实施一级封锁协议,并且事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。,2 锁,两阶段封锁协议:加锁和解锁“两阶段”是获得锁的第一阶段和释放锁的第二阶段一个事务中一旦开始释放锁,就不能再申请新锁了。事务的加锁和解锁严格分为两个阶段,第一阶段加锁,第二阶段解锁。可实现并发的串行化调度,2 锁,加锁内容包括:在事务T的R(A)操作之前,先对A加S锁,如果加锁成功,则执行操作R(A),否则,将R(A)加入A的等待队列。在事务T的W(A)操作之前,先对A加X锁,如果加锁成功,则执
19、行操作W(A),否则,将W(A)加入A的等待队列。,2 锁,解锁内容包括:在收到事务的Abort或Commit请求后,释放T在每个数据上所加的锁,如果在数据A的等待队列中不空,即有其它的事务等待对A进行操作,则从队列中取出第一个操作,完成加锁,然后执行该操作。执行Abort和Commit请求后,不再接收该事务的读写操作。,2 锁,两阶段封锁协议举例:事务1的封锁序列:Slock A.Slock B.Xlock C.Unlock C.Unlock B.Unlock A;事务2的封锁序列:Slock A.Unlock A.Slock B.Xlock C.Unlock C.Unlock B;事务1遵
20、守两段锁协议,而事务2不遵守两段协议。,2 锁,封锁粒度封锁对象的大小称为封锁粒度。封锁对象可以是逻辑单位,这时的粒度可以是数据库、表、元组、属性。封锁对象也可以是物理单位,这时的封锁对象可以是数据块、物理记录。不同的粒度会影响事务的并发度。,2 锁,两个事务造成的死锁问题,2 锁,DBMS的并发控制子系统保证了事务的隔离性,尽管同时有很多事务在使用系统,但是它们互不干扰,就像单独使用系统一样,不会出现丢失修改,读脏数据,不可重复读等问题。对于一些只读事务,有时可以忍受读脏数据,不可重复读等问题,为了加快它的执行,不需要严格的按照两段锁协议运行。SQL提供的隔离级别设置语句能满足这个要求。,3
21、 隔离级别,隔离级别考虑因素是否在读数据的时候使用锁读锁持续多长时间在读数据的时候使用何种类型的锁SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE,3 隔离级别,(1)READ UNCOMMITTED 执行事务的读操作之前不对数据对象加S锁,可能会读到未完成事务的操作结果(脏数据),不能重复读。(2)READ COMMITTED执行事务的读操作之前对数据对象加S锁,执行完读操作之后立刻释放S锁。不会读到脏数据,但不能重复读。(3)REPEATABLE READ
22、执行事务的读操作之前对数据对象加S锁,持有该锁直到事务结束,可以重复读。,3 隔离级别,(4)SERIALIZABLE严格按照两段封锁协议对数据加锁。,3 隔离级别,ANSI 99定义了4种事务隔离级别,SQL Server 能够完全支持这些级别:未提交读 在读数据时不会检查或使用任何锁。因此,在这种隔离级别中可能读取到没有提交的数据。已提交读 只读取提交的数据并等待其它事务释放排它锁。读数据的共享锁在读操作完成后立即释放。可重复读 像已提交读级别那样读数据,但会保持共享锁直到事务结束。可序列化 工作方式类似于可重复读。但它不仅会锁定受影响的数据,还会锁定这个范围。这就阻止了新数据插入查询所涉
23、及的范围,这种情况可以导致幻像读。,3 隔离级别,本章着重介绍了事务的概念,事务的ACID特性,DBMS为了实现事务特性而采取的相关技术,事务处理对程序员的影响和要求。读者应重点掌握定义事务的SQL语句、设置隔离性的SQL语句和死锁对事务的影响。,6.4 小结,6.4 小结,事务由一系列的SQL语句组成更新事务:包含UPDATE、DELETE和INSERT语句。只读事务:只包含SELECT语句的只读事务。2.程序员要根据项目的具体要求决定把哪些SQL语句定义成一个事务。每个事务的最后一个SQL语句是ABORT(rollback)或COMMIT。,3.恢复技术采用日志文件和数据库副本来保证事务的
24、原子性和持久性。DBMS把事务对数据库的每个操作形成一个日志记录,日志记录包含了被更新数据对象的原值和新值,按照执行的先后次序形成了事务的日志文件。数据库管理员定期备份数据库。在出现事务故障、系统故障和介质故障时,由数据库副本和日志文件可以把数据库恢复到最近的一个一致性状态。,6.4 小结,4.事务的隔离性由并发控制子系统实现。一般的商用DBMS采用二段封锁协议实现并发控制,执行读和写操作之前要分别对数据对象加S锁和X锁,并持有到事务结束再统一解锁。5.对只读事务,可以根据情况,通过设置合理的隔离级别来加快其执行速度。6.SQL语句可能由于违反系统定义的完整性约束而被拒绝执行,也可能由于事务陷入了死锁而被系统撤销。,6.4 小结,