数据库原理及应用开发技术_事务管理6.ppt_第1页
数据库原理及应用开发技术_事务管理6.ppt_第2页
数据库原理及应用开发技术_事务管理6.ppt_第3页
数据库原理及应用开发技术_事务管理6.ppt_第4页
数据库原理及应用开发技术_事务管理6.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

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

温馨提示

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

评论

0/150

提交评论