设为首页 收藏本站
查看: 436|回复: 0

[经验分享] Oracle 事物隔离级别

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-5-23 09:29:22 | 显示全部楼层 |阅读模式
1、事务介绍
Oracle11g中的事务是隐式自动开始的,不需要用户显示的执行开始事务语句。但对于事务的结束处理,则需要用户进行指定的操作。通常在以下情况下,Oracle认为一个事务结束了。
(1)  执行Commit语句提交事务
(2)  执行Rollback语句撤销事务
(3)  执行一条数据定义语句。如果该语句执行成功,那么oracle系统会自动执行commit命令;否则,系统会自动执行Rollback命令。
(4)  执行一个数据控制命令,当语句执行完毕,oracle系统会自动执行commit命令。
(5)  正常的断开数据库的连接、正常的退出sqlplus环境,那么oracle系统会自动执行commit命令;否则,系统会自动执行Rollback命令。
2、Commit语句
Commit代表提交事务,oracle系统内部会按照如下顺序进行处理:
(1)  首先在回滚段内记录当前事务已提交,并且声明一个唯一的系统编号(SCN),以唯一标识这个事务。
(2)  然后启动后台的日志写入进程(LGWR),将SGA区的重做日志缓冲区中的数据和当前事务的SCN写入重做日志文件中。
(3)  接着Oracle服务器开始释放事务处理所使用的系统资源。
(4)  最后显示通知,告诉用户事务已经成功提交完毕。
3、Rollback语句
Rollback代表撤销事务,oracle系统内部会按照如下顺序进行处理:
(1)   首先使用回滚段中的数据撤销对数据库所做的修改。
(2)   然后Oracle后台服务器进程释放掉事务所使用的系统资源。
(3)   最后显示通知,告诉用户事务已经撤销成功。
4、保存点
Oracle不仅允许回退整个未提交的事务,还允许回退事务的一部分,这个可以通过“保存点”来完成。在事务的执行过程中,用户可以通过建立保存点将一个较长的事务分隔为几部分。这样用户就可以有选择性的回退到某个保存点,并且该保存点之后的操作都将被撤销。
?     基本语法:
savepoint 保存点名称
           ………………
           Rollback to 保存点名称  或  rollback --撤销全部事务
?     说明:
(1)         一个事务中可以保存多个保存点,不能2次回退到同一保存点,一旦回退过一次,保存点就失效了。
(2)         保存点的设置代价是有资源开销的。
(3)         一旦提交了事务,则不能回退到任何保存点。
5、 事务隔离级别
?     说明:事务隔离级别由国际标准化组织定义,不是所有的DBMS都遵循。
?     简介:事务隔离级别定义了事务与事务之间的隔离程度。隔离级别与并发性是相互矛盾的。隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
?     并发操作引起的错误
(1)         脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。(oracle中无此现象)
(2)         不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改和删除,每次返回不同的结果集,此时发生不可重复读。
例如:
Insert into emp(empno,ename) values(9000, '李明')
Sqlplus  2: select * from emp;  
      Sqlplus  1: delete from emp where empno=9000
                  Commit
      Sqlplus 2: select * from emp; --两次查询的记录不同
(3)         幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
例如:
  Sqlplus  2: select * from emp;  
     Sqlplus 1:  Insert into emp(empno, ename)values(9999, '李亮');
                 Commit;
     Sqlplus 2: select * from emp; --两次查询的记录不同
?  事务隔离级别的概念:隔离级别定义了事务与事务之间的隔离程度
隔离级别
脏读
不可重复读
幻读
读未提交(read uncommitted)
读已提交(read committed)
×
可重复读(repeatable read)
×
×
可串行化(serializable)
×
×
×
6、Oracle的事务隔离级别
   Oracle提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。read-only是serializable的子集,它们都避免了非重复读和幻读,区别是read-only中不允许sql进行DML操作。
?     Oracle的readcommitted说明
(1)         这是oracle缺省的事务隔离级别
(2)         保证不会脏读:但可能出现不可重复读和幻读
?     Oracle的serializable说明
(3)         使事务看起来像是一个接着一个顺序的执行
(4)         仅仅能看到本事务开始前由其他事务提交的更改和在本事务中所做的更改
(5)         保证不会出现脏读、不可重复读和幻读
(6)         提供了read-only事务所提供的读一致性,同时又允许DML操作
?  Oracle的事务隔离级别设置
(1)         设置一个事务的隔离级别
Set transaction isolation level readcommitted; --(默认)
Set transaction isolation levelserializable; --代价比较高昂
Set transaction read only;
(2)         设置整个会话的隔离级别
Alter session set isolation_level=serializable;
Alter session set isolation_level=readcommitted;
7、可串行化
?  介绍:可串行化就是使事务看起来像是一个接着一个顺序执行。事务在开始前对数据库中的所有数据拍了一个快照,在事务执行过程中仅能看到这个快照中的数据和在本事务中所做的更新。
注意:sys用户不能运行Set transaction isolation level serializable。
?  举例1:
Sqlplus  2:  Settransaction isolation level serializable; --用commit保证它是事务第一条语句
           Select * from emp;
Sqlplus  1: select * from emp;
          Delete from emp where empno=9999;
          Commit;
Select * from emp;
Sqlplus  2: Select * from emp; --没有发生不可重复读,删除记录对其没起作用
?  举例2:
Sqlplus  2:  Settransaction isolation level serializable;
           Select * from emp;
Sqlplus  1: select * from emp;
          Insert into emp(empno, ename)values(9998, '王明')
          Commit;
Select * from emp;
Sqlplus  2: Select * from emp; --没有发生幻读,插入记录对其没起作用


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-19522-1-1.html 上篇帖子: oracle11g安装时报INFO:INFO错误解决 下篇帖子: oracle日期时间函数总结 Oracle 隔离
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表