第12章事务处理与并发控制ppt课件.ppt_第1页
第12章事务处理与并发控制ppt课件.ppt_第2页
第12章事务处理与并发控制ppt课件.ppt_第3页
第12章事务处理与并发控制ppt课件.ppt_第4页
第12章事务处理与并发控制ppt课件.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

第12章事务处理与并发控制 本章要点 12 1事务概述 1 事务的概念在日常生活和工作中 人们为了完成一定的任务都会执行一系列逻辑上相关的操作 这些操作共同影响着任务的实现结果 在Oracle中把这些操作的集合看作一个事务 TRANSACTION Oracle中 用户不能显示的开始一个事务 一般在上一个事务结束 被提交或被回滚 后 新事务会隐式的在修改数据的第一条语句处开始 Oracle中的事务结束会发生在 用户使用COMMIT命令显示提交事务 用户使用ROLLBACK命令回滚整个事务 用户执行了一条DDL语句 用户正常断开了与Oracle的连接 这时用户当前的事务将被自动提交 用户进程意外被终止 这时用户当前的事务被回滚 用户关闭SQL PLUS会话时 默认使用ROLLBACK回滚事务 12 2事务的特性 数据库中的事务具有ACID属性 原子性 Atomicity 一致性 Consistency 隔离性 Isolation 持久性 Durability 12 2 1原子性 事务的原子性是指构成事务的所有语句要么都成功执行 要么都失败 不会有部分成功部分失败的情况发生 事务是一个最基本的执行单元 事务的原子性可以分为以下级别 1 语句级原子性指每条语句本身也是最小级别的事务 该语句要么完全执行成功 要么完全失败 并且它不会影响其他语句的执行 实际上 Oracle在每条被执行的语句前都隐式设置了保存点 SAVEPOINT 如语句INSERTINTOtable1VALUES 1 可以理解为 SAVEPOINTstatement1 INSERTINTOtable1VALUES 1 IFERRORTHENROLLBACKTOstatement1 例12 1建立表t1 并且设置检查约束 然后向表中添加3条记录 其中2条满足约束条件1条不满足约束条件 提交后查询表中的记录 CREATETABLEt1 idNUMBERCHECK id 0 INSERTINTOt1VALUES 1 INSERTINTOt1VALUES 1 INSERTINTOt1VALUES 2 COMMIT 提交事务 SELECT FROMt1 ID 12 另外 语句级原子性还表现在该语句的任何副作用 如被它触发的触发器 也被认为是该语句的一部分 也就是说如果该语句成功 受它影响的其他操作也将成功 如果该语句失败并回滚 受它影响的其他操作也将被自动回滚 如下例所示 例12 2在例12 1的基础上为表t1创建插入操作的事前行级触发器 并创建表t2用于统计t1表中的行数 步骤1 创建表t2 并插入初始值2 CREATETABLEt2 rNUMBER INSERTINTOt2VALUES 2 步骤2 为表t1创建插入触发器CREATEORREPLACETRIGGERinsert t1BEFOREINSERTONt1FOREACHROWBEGINUPDATEt2SETr r 1 dbms output put line 插入触发器被触发 END 步骤3 向t1表中插入不满足约束条件的值 1 INSERTINTOt1VALUES 1 执行结果如图12 1所示 查询表t2中的记录的个数SELECT FROMt2 R 2 修改t2表的update操作已经被执行 修改t2表的update操作已经被回滚 2 过程级原子性过程级原子性是指Oracle把PL SQL匿名过程块也当作是语句 当作一个整体 过程中的所有代码要么都执行成功 要么都执行失败 并且不影响过程外的其他语句 例12 3利用INSERT语句和一个匿名过程块分别向例12 1创建的表t1中插入新数据 利用INSERT命令向表t1中插入数据3INSERTINTOt1VALUES 3 利用匿名块向表t1中插入数据4和 1BEGININSERTINTOt1VALUES 4 INSERTINTOt1VALUES 1 END 提交COMMIT 查询t1表中的数据SELECT FROMt1 ID 123 过程中被插入的新数据均被回滚 3 事务级原子性事务级原子性是指Oracle把整个事务中的所有语句和匿名块都当作一个整体 一个事务 用户在提交或回滚事务时 要么所有语句都执行 要么都失败 事务级原子性中包含了语句级原子性和过程级原子性 整个事务中的语句或匿名块首先受语句级原子性和过程级原子性的影响 例12 4利用例12 1创建的表t1 向表中添加两行新数据4和5 然后提交事务 最后查询表中的记录 INSERTINTOt1VALUES 4 INSERTINTOt1VALUES 5 COMMIT SELECT FROMt1 ID 12345 事务中的所有语句均执行成功 例12 5利用例12 1创建的表t1 向表中添加两行新数据6和7 然后回滚事务 最后查询表中的记录 INSERTINTOt1VALUES 6 INSERTINTOt1VALUES 7 ROLLBACK SELECT FROMt1 ID 12345 事务中的所有语句均被回滚 12 2 2一致性 事务的一致性是指数据库在事务操作前满足一定的业务处理规则 事务操作后也要满足这样的业务处理规则 参见例12 6 12 2 3隔离性 事务的隔离性是指 当多个用户 多个会话同时访问Oracle数据库的时候 他们之间是未知的 不可见的 互不影响的 由于事务具有隔离性才能保证Oracle实现多用户多会话的并发处理 例12 7打开两个SQL Plus窗口模拟多用户的并发操作 使用例12 6中创建的table1表分别在两个窗口中执行插入操作和查询操作 在插入操作提交前 两个窗口中看到的数据不相同 在窗口1中执行插入命令和查询命令 代码和执行结果如下 INSERTINTOtable1VALUES 4 SELECT FROMtable1 ID 234 在窗口2中执行查询命令 执行结果如下 SELECT FROMtable1 ID 23 事务的隔离性不允许多个会话同时修改相同的数据 除非较早的修改命令提交结束后 其他窗口才允许修改 12 2 4持久性 事务的持久性是指 事务一旦提交 它的改变就会永久生效 不能再被撤销 回滚 即使出现系统故障或错误 改变也不会消失 12 3事务管理命令 对事务执行各种操作的常见命令如下 COMMIT事务提交命令ROLLBACK事务回滚命令SAVEPOINT设置保存点命令ROLLBACKTO回滚到保存点命令SETTRANSACTION设置事务属性命令SETCONSTRAINT设置约束的可延迟性命令 12 3 1COMMIT命令 COMMIT是事务提交命令 表明该事务对数据库所做的修改操作将永久记录到数据库中 不能被回滚 用户执行修改数据库的操作但未提交时 Oracle已经完成了对数据库的实际操作 主要包括 Oracle生成了回滚信息 Oracle在SGA中生成了重做日志条目 修改后的新数据已经被写入SGA中的数据缓冲区 事务被提交时 Oracle进行以下操作 为此事务分配一个唯一的系统变化编号 SYSTEMCHANGENUMBER 简称SCN 又称Oracle的内部时钟 重做日志写进程 LGWR 将SGA内重做日志缓冲区中的重做日志条目写入重做日志文件中 同时还将此事务的SCN也写入重做日志文件 释放事务操作中占用的数据 即解除添加到表或数据行上的各种锁 通知用户事务已经成功提交 从以上得知 提交事务的时间和事务的大小 没有关系 Oracle中事务的提交方式 显示执行COMMIT命令提交事务隐式提交执行DDL语句时它前后的事务被隐式提交 DDL语句自己是一个独立的事务 正常结束会话时事务隐式提交设置setautocommiton事务可自动提交参见例12 9 12 3 2ROLLBACK命令 ROLLBACK是事务回滚命令 表明撤销未提交的事务所做的各种修改操作 回滚事务的时间和事务中修改的数据量成正比 当事务被回滚时 Oracle将执行以下操作 使用回滚表空间内存储的相关信息撤销事务中所有SQL语句对数据的修改 释放事务中占用的各种资源 即解除该事务对表或行施加的各种锁 通知用户事务回滚操作已经完成 例12 10向scott方案下的emp表中插入职工编号为1113的记录并用UPDATE命令将该记录的职工姓名修改为张三 然后用ROLLBACK命令回滚整个事务 代码如下 INSERTINTOscott emp empno VALUES 1113 插入职工编号为1113的记录SELECT FROMscott empWHEREempno 1113 执行查询命令查看该员工的姓名为nullUPDATEscott empSETename 张三 WHEREempno 1113 修改姓名为张三SELECT FROMscott empWHEREempno 1113 该员工姓名从null改为张三ROLLBACK 执行回滚操作 撤销整个事务SELECT FROMscott empWHEREempno 1113 找不到该记录 12 3 3SAVEPOINT和ROLLBACKTOSAVEPOINT命令 SAVEPOINT命令可以在事务中的某个地方设置保存点 将一个大的事务划分为几个片段 当某个保存点后面的命令出现错误需要回滚时 只需回滚到该保存点 不影响保存点前面操作的执行 也不影响该回滚命令之后的操作 当事务被回滚到某个保存点时 Oracle将执行以下操作 回滚指定保存点之后的所有语句 保留指定的保存点 但其后创建的保存点都将被清除 释放此保存点后面获得的表级锁与行级锁 但它之前的数据锁依然保留 因此 回滚到保存点时 并不结束整个事务 定义保存点的格式 SAVEPOINT保存点名称 回滚到指定保存点的格式 ROLLBACKTO保存点名称 参见例12 11 12 3 4SETTRANSACTION命令 用户可以使用SETTRANSACTION命令设置当前事务的属性 如设置事务的隔离级别 设置事务回滚时用的存储空间以及为事务命名等操作 使用该命令时需要注意的事项 该语句必须是当前事务中的第一条语句 命令设置的事务属性只对当前事务生效 当该事务结束后 设置的属性也将失效 事务的隔离级别是指事务与事务之间的隔离程度 能够有效解决并发事务之间的干扰 主要包括 1 READONLY 只读 当前事务只能对数据库执行SELECT操作不能执行INSERT UPDATE DELETE操作 数据库被冻结为事务刚开始的状态 其他事务后来对数据库的修改操作在当前事务中不可见 2 READWRITE 读写 当前事务可以对数据库执行增 删 改 查的全部操作 并不冻结数据库状态 当前事务能够看到其他事务提交后的数据库修改操作 这是事务的默认隔离级别 一般不用单独设置 3 ISOLATIONLEVELSERIALIZABLE 串行读 当前事务可以对数据库执行增 删 改 查的全部操作 并且冻结数据库的状态 该事务能够看到自己对数据库的修改操作 但是看不到其他事务对数据库的修改操作 4 ISOLATIONLEVELREADCOMMITTED 提交读 该隔离级别的作用和READWRITE一致 当前事务可以读取其他事务提交后的数据 看不到未提交的数据 这也是默认级别 不需单独设置 12 3 5SETCONSTRAINT命令 SETCONSTRAINT命令用来设置数据库中的约束在事务中是立即生效还是延迟到事务提交时再生效 另外 Oracle只能延迟在创建约束时指定了可被延迟的约束 设置约束延迟的格式如下 SETCONSTRAINTALL DEFERRED IMMEDIATE 参见例12 12 注意 在该例子中设置约束可被延迟的属性 CONSTRAINTpk testPRIMARYKEYDEFERRABLEINITIALLYIMMEDIATE 12 4 1并发问题 多个用户 多个事务同时访问同一数据库的行为被称作并发操作 这些并发操作如果得不到有效的控制和管理 会产生以下负面影响 丢失更新错读 脏读 不一致的分析 不可重复读 幻读应用事务的隔离特性和数据库中的锁实现并发控制 12 4 2锁 Oracle中的锁可以分为DDL锁 DML锁 内部锁 Oracle中的锁可以分

温馨提示

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

评论

0/150

提交评论