




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章事务处理和并发控制 在关系数据库编程中 常常要用到 事务 和 锁 这两个概念 事务是一个逻辑工作单元 是不可停顿的一系列操作 一个事务 要么一口气运行完毕 要么什么也不运行 当用户对数据库并发访问时 为了确保事务的完整性和数据库一致性 需要使用 锁 事务和锁是两个紧密联系的概念 5 1事务的基本概念 关系型数据库有四个显著的特征 安全性 完整性 检测性和并发性 安全性就是要保证数据库的数据安全 防止未授权用户随意修改数据库中的数据 完整性是在数据库中 区别所保存的数据是无用的垃圾还是有价值的信息 主要是依据数据库的完整性是否健全 即实体完整性 域完整性和参照完整性是否健全 5 1 1事务的特性 检测性是对于任何影响系统性能的因素或瓶颈 都要采取切合实际的检测措施 以解决问题 并发性是用来解决多个用户对同一数据进行操作时的问题 提高数据库的处理速度 单单依靠提高计算机的物理速度是不够的 还必须充分考虑数据库的并发性问题 提高数据库并发效率 如何保证并发性呢 通过使用事务和锁机制 就可以解决数据库的并发性问题 在关系型数据中 事务要求处理时必须满足ACID原则 即原子性 一致性 隔离性 和持久性 原子性是指事务必须执行一个完整的工作 要么执行全部数据的操作 要么全部不执行 一致性是指当事务完成时 所有的数据必须具有一致的状态 隔离性也称为独立性 是指并行事务的修改必须与其他并行事务的修改相互独立 一个事务处理数据 要么是其他事务执行之前的状态 要么是其他事务执行之后的状态 持久性是指当一个事务完成之后 将其影响永久性地存于系统中 写入数据库中 定义5 1 事务是作为单个逻辑工作单元执行的一系列操作 一个逻辑工作单元必须有四个属性 称为原子性 一致性 隔离性和持久性 ACID 属性 只有这样才能成为一个事务 现在要问 事务的这些属性是如何保证或如何实现的呢 请看下面的回答 事务开始之后 事务所有的操作都陆续写到事务日志中 当取消这种事务时 系统自动执行这种操作的反操作 保证系统的一致性 系统自动生成一个检查点机制 这个检查点周期地发生 检查点的周期是系统根据用户定义的时间间隔和系统活动的频度 由系统自动计算出来的时间间隔 检查点周期地检查事务日志 如果在事务日志中 事务全部完成 那么检查点将事务提交到数据库中 并且在事务日志中做一个检查点提交标记 如果在事务日志中 事务没有完成 那么检查点不将事务日志中的事务提交到数据库中 并且在事务日志中做一个检查点未提交标记 5 1 2事务的类型 1 根据系统的设置分类根据系统的设置不同 将事务分为系统事务 用户定义事务和分布式事务 1 系统事务系统提供的事务是指在执行某些语句时 一条语句就是一个事务 但是要明确 一条语句的对象既可能是表中的一行数据 也可能是表中的多行数据 甚至是表中的全部数据 因此 只有一条语句构成的事务也可能包含了多行数据的处理 系统提供的事务语句如下 ALTERTABLE CREATE DELETE DROP FETCH GRANT INSERT OPEN REVOKE SELECT UPDATE TRUNCATETABLE 这些语句本身就构成了一个事务 例5 1 使用CREATETABLE创建一个表 CREATETABLEstudent idCHAR 10 nameCHAR 6 sexCHAR 2 2 用户定义事务在实际应用中 大多数的事务处理采用了用户定义事务来处理 在开发应用程序时 可以使用BEGINTRANSACTION语句来定义用户定义事务 在使用用户定义事务时 一定要注意事务必须有明确的结束语句来结束 事务的结束可以使用两个语句中的一个 COMMIT语句和ROLLBACK语句 COMMIT语句是提交语句 将全部完成的语句明确地提交到数据库中 ROLLBACK语句是取消语句 该语句将事务的操作全部取消 即表示事务操作失败 3 分布式事务 还有一种特殊的用户定义事务 这就是分布式数据库中的分布式事务 如果一个比较复杂的环境 可能有多台服务器 那么要保证在多台服务器环境中事务的完整性和一致性 就必须定义一个分布式事务 在这个分布式事务中 所有的操作都可以涉及对多个服务器的操作 当这些操作都成功时 那么所有这些操作都提交到相应服务器的数据库中 如果这些操作中有一个操作失败 那么这个分布式事务中的全部操作都将被取消 2 根据运行模式分类根据运行模式 将事务分为自动提交事务 显示事务 隐式事务和批处理级事务 1 自动提交事务 是指每条单独的语句都是一个事务 2 显式事务 指每个事务均以BEGINTRANSACTION语句显式开始 以COMMIT或ROLLBACK语句显式结束 3 隐式事务 指在前一个事务完成时新事务隐式启动 但每个事务仍以COMMIT或ROLLBACK语句显式完成 4 批处理级事务 只能应用于多个活动结果集 MARS 中 在MARS会话中启动的T SQL显式或隐式事务变为批处理级事务 当批处理完成时 没有提交或回滚的批处理级事务 自动由SQLServer语句集合分组后形成单个的逻辑工作单元 3 事务处理语句根据连接对象提供用于事务处理的方法 来划分事务 BEGINTRANSACTION用于开始一个事务 ROLLBACKTRANSACTION用于回滚事务 COMMITTRANSACTION用于提交所有的事务处理结果 即确认事务的处理 BeginTrans和CommitTrans用于标记事务的开始和结束 在这两个语句之间的语句 就是作为事务处理的语句 判断事务处理是否成功 可通过连接对象的Error集合来实现 若Error集合的成员个数不为0 则说明有错误发生 事务处理失败 Error集合中的每一个Error对象 代表一个错误信息 5 2并发控制 锁 是防止其他事务访问指定资源的手段 锁是实现并发控制的主要方法 是多个用户能够同时操纵同一个数据库的数据 而不发生数据不一致现象的重要保障 5 2 1锁的概述 如果不加上锁 那么就可能出现 脏读 不可重复读 和 幻觉读 这三种错误现象 所谓脏读 是指当一个事务正在访问数据 并且对数据进行了修改 而这种修改还没有提交到数据库中 这时 另外一个事务也访问这个数据 然后使用了这个数据 因为这个数据是一个还没有提交的数据 那么另外事务读到这个数据就是脏数据 依据脏数据所做的操作 可能是不正确的 所谓不可重复读 是指在一个事务内 多次读同一数据 在这个事务还没有结束时 另外一个事务也访问该数据 那么 在两次读同一个数据之间 由于第二个事务的修改 则第一个事务两次读到的数据可能是不一样的 所谓幻觉读 是指当事务不是独立执行时发生的一种现象 例如第一个事务对一个表中的数据进行了修改 这种修改涉及到表中的全部数据行 同时 第二个事务也修改这个表中的数据 这种修改是向表中插入一行新数据 那么 以后就会发生 第一个事务的用户就会发现表中还有没有修改的数据行 锁是防止其他事务访问指定的资源控制 实现并发控制的一种手段 为了提高系统的性能 加快事务的处理速度 缩短事务的等待时间 应该使资源锁定 但是锁定的资源应该最小化 也就是说封锁的粒度要小 数据库引擎使用不同的锁 这些锁的模式确定了并发事务访问资源的方式 根据锁定资源方式的不同 数据库系统提供了四种锁模式 共享锁 排他锁 更新锁 意向锁 1 共享锁共享锁也称为S锁 允许并行事务读取同一种资源 这时的事务不能修改访问的数据 当使用共享锁锁定资源时 不允许事务修改访问的数据 当读取数据的事务读完数据之后 立即释放所占用的资源 一般地 当使用SELECT语句访问数据时 系统自动对所访问的数据使用共享锁锁定 2 排他锁对于那些修改数据的事务 例如 使用INSERT UPDATE DELETE语句 系统自动在所修改的事务上放置排他锁 排他锁也称独占锁或X锁 有时又称为写锁 就是在同一时间内只允许一个事务访问一种资源 其他事务都不能在有排他锁的资源上访问 在有排他锁的资源上 不能放置共享锁 只有当产生排他锁的事务结束之后 排他锁锁定的资源才能被其他事务使用 3 更新锁更新锁也称为U锁 可以防止常见的死锁 在可重复读事务中 此事务读取数据 获取资源的共享锁 然后修改数据 此操作要求锁转换为排他锁 如果两个事务获取了资源上的共享锁 然后试图同时更新数据 则一个事务尝试将锁转换为排他锁 共享锁到排他锁的转换必须等待一段时间 发生锁等待 第二个事务试图获取排他锁以进行更新 由于两个事务都要转换为排他锁 并且每个事务都等待另一个事务释放共享锁 因此发生死锁 4 意向锁 意向锁的含义是 如果对一个结点用意向锁锁定 则表明该结点的下层结点正在被加锁 对任意结点加锁时 必须先对它的上层结点用意向锁锁定 例如 对任意元组加锁时 必须先对它所在的关系用意向锁锁定 意向锁又分为意向共享锁 IS 意向排他锁 IX 以及意向排他共享锁 SIX 1 意向共享锁 表示读低层次资源的事务的意向 把共享锁放在这些单个的资源上 2 意向排他锁 表示修改低层次的事务的意向 把排他锁放在这些单个资源上 意向排他锁包涵意向共享锁 它是意向共享锁的超集 3 意向排他共享锁 表示允许并行读取顶层资源的事务的意向 并且修改一些低层次的资源 例如 表上的一个事务使用意向排他共享锁 把共享锁放在表上 允许并行读取 并且把意向排他锁放在刚要修改的页上 把排他锁放在修改的行上 每一个表一次只能有一个事务使用意向排他共享锁 因为表上的共享锁 阻止对表的任何修改 这是使用意向排他共享锁和意向排他锁的组合例子 另外 从程序员的角度看 锁还可以分为以下两种类型 1 乐观锁乐观锁假定在处理数据时 不需要在应用程序的代码中做任何事情就可以直接在记录上加锁 即完全依靠数据库来管理锁的工作 一般情况下 当执行事务处理时 SQLServer会自动对事务处理范围内更新到的表做锁定 2 悲观锁悲观锁对数据库的自动管理不感兴趣 需要程序员直接管理数据或对象上的加锁处理 并负责获取 共享和放弃正在使用的数据上的任何锁 5 2 2死锁及处理 在事务锁的使用过程中 死锁是一个不可避免的现象 在下列两种情况下 可能发生死锁 死锁的第一种情况是 当两个事务分别锁定了两个单独的对象 这时每一个事务都希望在另外一个事务锁定的对象上获得一个锁 因此 每一个事务都有必须等待另一个事务释放占有的锁 这时就发生了死锁 这种死锁是最典型的死锁形式 死锁的第二种情况是 当在一个数据库中 有若干个长时间运行的事务执行并行的操作 当查询分析器处理一种非常复杂的查询 例如连接查询时 那么 由于不能控制处理的顺序 有可能发生死锁 当发生了死锁现象时 除非某个外部进程断开死锁 否则死锁中的两个事务都将无期等待下去 数据库管理系统有自动检测死锁的循环机制 此时数据库引擎会选择一个事务作为死锁的牺牲品 然后终止当前事务来打断死锁 如果监视器检测到循环依赖关系 通过自动取消其中一个事务来结束死锁 处理时间长的事务具有较高的优先级 处理时间较短的事务具有较低的优先级 在发生冲突时 保留优先级高的事务 取消优先级低的事务 5 3数据库恢复机制 计算机故障的原因很多 包括磁盘故障 电源故障 软件故障 灾害故障 以及人为破坏等 一旦发生这些故障 就有可能造成数据的丢失 数据库管理系统的备份和恢复机制 就是保证数据库系统出现故障时 能够将数据库系统还原到正确状态 5 3 1数据库故障 1 事务故障事务故障 意味着事务没有达到预期的终点 因此 数据库可能处于不正确状态 恢复程序要在不影响其它事务运行的情况下 强行回滚 ROLLBACK 该事务 即撤消该事务已经做出的任何对数据库的修改 使得该事务好像根本没有启动一样 这类恢复操作称为事务撤消 UNDO 为保证数据的一致性 恢复子系统必须在系统重新启动时让所有非正常终止的事务回滚 强行撤消 UNDO 所有未完成事务 重做 Redo 所有已提交的事务 2 系统故障系统故障 意味着系统停止运转的任何事件 使得系统要重新启动 这类故障影响正在运行的所有事务 但不破坏数据库 这时主存内容被丢失 尤其是数据库缓冲区中的内容都被丢失 所有运行事务都非正常终止 发生系统故障时 一些尚未完成的事务的结果可能已送入物理数据库 有些已完成的事务可能有一部分甚至全部留在缓冲区 尚未写回到磁盘上的物理数据库中 从而造成数据库可能处于不正确的状态 3 介质故障系统故障常称为软故障 介质故障称为硬故障 硬故障将破坏数据库或部分数据库 影响正在存取这部分数据的所有事务 这类故障比前两类故障发生的可能性小 但破坏性大 总结各类故障 对数据库的影响有两种可能性 一是数据库本身被破坏 二是数据库没有破坏 但数据可能不正确 这是因为事务的运行被非正常终止 恢复的基本原理十分简单 可以用一个词来概括 冗余 这就是说 数据库中任何一部分被破坏的或不正确的数据 可以根据存储在系统别处的冗余数据来重建 5 3 2数据库备份 恢复机制涉及的两个关键问题是 第一是如何建立冗余数据 第二是如何利用这些冗余数据实施数据库恢复 建立冗余数据最常用的技术 是数据转储和登录日志文件 通常在一个数据库系统中 这两种方法是一起使用的 1 转储 建立冗余数据 所谓转储 就是数据库管理员DBA 定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程 这些备用的数据文本 称为后备副本或后援副本 当数据库遭到破坏后 可以将后备副本重新装入 但重装后备副本只能将数据库恢复到转储时的状态 要想恢复到故障发生时的状态 必须重新运行自转储以后的所有更新事务 转储是十分耗费时间和资源的 不能频繁进行 DBA应该根据数据库使用情况 确定一个适当的转储周期 2 日志文件日志文件 是用来记录事务对数据库的更新操作的文件 不同数据库采用的日志文件 格式并不完全一样 对于以记录为单位的日志文件 需要登记的内容包括 1 各个事务的开始 BEGINTRANSACTION 标记 2 各个事务的结束 COMMIT或ROLLBACK 标记 3 各个事务的所有更新操作 这里每个事务开始的标记 每个事务的结束标记和每个更新操作 均作为日志文件中的一个日志记录 每个日志记录的内容主要包括 1 事务标识 标明是那个事务 2 操作的类型 插入 删除或修改 3 操作对象 记录内部标识 4 更新前数据的旧值 对插入操作而言 此项为空值 5 更新后数据的新值 对删除操作而言 此项为空值 5 3 3数据库恢复 1 恢复策略与方法 1 事务故障的恢复事务故障 是指事务在运行至正常终止点前被中止 这时恢复子系统应利用日志文件 撤消 UNDO 此事务已对数据库进行的修改 事务故障的恢复是由系统自动完成的 对用户是透明的 系统的恢复步骤 反向扫描文件日志 即从最后向前扫描日志文件 查找该事务的更新操作 对该事务的更新操作执行逆操作 将日志记录中 更新前的值 写入数据库 这样 如果记录中是插入操作 则相当于做删除操作 若记录中是删除操作 则做插入操作 若是修改操作 则相当于用修改前值代替修改后值 继续反向扫描日志文件 查找该事务的其他更新操作 并做同样处理 如此处理下去 直至读到此事务的开始标记 事务故障恢复就完成了 2 系统故障的恢复系统故障造成数据库不一致状态的原因有两个 一是未完成事务对数据库的更新 可能已写入数据库 二是已提交事务对数据库的更新可能还留在缓冲区 没来得及写入数据库 因此恢复操作就是要撤消故障发生时未完成的事务 重做已完成的事务 系统故障的恢复是由系统在重新启动时自动完成的 不需要用户干预 系统的恢复步骤 正向扫描日志文件 找出在故障发生前已经提交事务 这些事务既有BEGINTRANSACTION记录 也有COMMIT记录 将其事务标识记入重做 REDO 队列 同
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业互联网平台同态加密技术在工业物联网设备安全中的应用案例报告
- 2025年在线教育市场报告:K2教育发展趋势及策略分析
- 设备维护计划考试题
- 各科的考试题目及答案
- 夜间施工安全培训记录课件
- 平板课件投屏到电视上
- 地质勘探员招聘考试地质基础知识考试题
- 年面点师证面食制作监考试题
- 新能源汽车智能化安全防护技术2025年技术创新应用场景研究报告
- 核科学基础试题及答案
- 台球俱乐部助教协议书
- 2025年农艺师职业资格考试试卷及答案
- 专利技术保密协议合同书
- 安全隐患排查讲座课件
- 2025年军队文职人员(司机岗)历年考试真题库及答案(重点300题)
- 生产绩效考核管理办法
- 电力安规考试题及答案
- 土建施工技术、工艺、重点、难点分析和解决方案
- 钣金生产车间安全培训
- 关于有两个孩子的离婚协议书(2025年版)
- 2025年江门楼盘统计表
评论
0/150
提交评论