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

[经验分享] 白话2种Oracle的事务隔离

[复制链接]

尚未签到

发表于 2016-7-25 08:57:32 | 显示全部楼层 |阅读模式
  Oracle事务的隔离级别有2总, Read Commitment, Serializable, Read Only (另外还有2种事务隔离级别,Read Uncommitted, Repatable Read,Oracle没有单独提供.)
  
  Read Only, 看名字就比较简单,在此我们不做讨论,下面主要分析一下Read Commitment, Serializable. 
  
  一句话描述:
  Read Commitment: 读取在语句开始时已经提交的, 修改冲突通过写一致性来解决数据的一致性.
  Serializable:            读取在事务开始时已经提交的. 修改冲突确保先提交的成功,后修改的回滚.
  
  比较细节
  
  不同点 

 读一致性写冲突
Read Commitment如果事务进行过程中,有数据在别的事务里面提交了,可以立即被当前事务读取到.先修改的可以正常提交,后修改的必须等到先修改提交之后.然后通过写一致性来重启事务
Serializable: 事务开始后,其他事务的所有修改对当前事务没有任何影响后修改数据的事务同样会被阻塞,但是当阻塞解除提交时会出现ORA-08177异常.
(ORA-08177: can't serialize access for this transaction)
  
  
  
  相同点

 

 读一致性写冲突
Read Commitment只有提交后的数据才会被读取,都不会读取脏数据.后修改数据的事务都会被阻塞,无法提交.
Serializable: 

 

 实验过程

下面的2个实验,比较了Oracle所支持的事务隔离模式, 在读取和修改数据时的详细区别. 如何切换数据库的隔离模式,可以参考下面的语句.

ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL = serializable;
 




  •  数据初始化



 下面的2个实验,在开始前需要使用上面的初始化脚本Reset数据.


DROP TABLE XXRPTH.TEST;
CREATE TABLE XXRPTH.TEST
(
NAME   VARCHAR(10),
VALUE  NUMBER(22)
);
insert into test values('lilao_1', 1);
insert into test values('lilao_2', 2);
insert into test values('lilao_3', 3);
commit;
 


  • 实验#1: 读取变化数据的区别



关键比较点,已经标红高亮

时间事务1事务2Read CommitmentSerializable: 
t1savepoint aaa;  显示开启事务1 
t2 savepoint bbb;   显示开启事务2
t3 update test 
set value=value+10 ;
  
t4select count(*) from test
where value>10;
 结果是0(读可提交)结果是0
t5 commit;  
t6select count(*) from test
where value>10;
 结果是3(幻象读,和t4时间读取的记录条数不一样了)结果是0
t7commit;   
t8select * from test; NAME            VALUE
---------- ----------
lilao_1            11
lilao_2            12
lilao_3            13
NAME            VALUE
---------- ----------
lilao_1            11
lilao_2            12
lilao_3            13

  

 

 


  • 实验#2: 写冲突的区别 

关键比较点,已经标红高亮


时间事务1事务2Read CommitmentSerializable: 
t1savepoint aaa;  显示开启事务1 
t2 savepoint bbb;  显示开启事务2
t3 update test 
set value=value+10 ;
  
t4select count(*) from test
 where value>10;
 结果是0(读可提交)结果是0
t5update test 
set value=value+100;
   
t6 commit; 
事务2提交时,事务1会抛出异常
ORA-08177: can't serialize access for this transaction
t7select * from test; NAME            VALUE
---------- ----------
lilao_1           111
lilao_2           112
lilao_3           113
NAME            VALUE
---------- ----------
lilao_1             1
lilao_2             2
lilao_3             3
t8commit;  
虽然事务1在T6时,抛出异常,但是事务并未终止.
所以T7时间没有查询到事务2的修改
t9select * from test; NAME            VALUE
---------- ----------
lilao_1           111
lilao_2           112
lilao_3           113
NAME            VALUE
---------- ----------
lilao_1            11
lilao_2            12
lilao_3            13

 

 

运维网声明 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-248916-1-1.html 上篇帖子: oracle log file switch (checkpoint incomplete) 解决 下篇帖子: (转)oracle数据库的整体结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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