2011年1月13日

重启动发生的原因:where条件读取时采用一致读和更新时采取当前读版本不一致造成
Oracle在执行DML语句时,会用到两种不同的方式去读取数据块:
1. 一致读:在“找到”需要修改的数据行时,会采用 consistent read
2. 当前读:在“获取”数据块来实际更新数据行时,会采用 current read

如更新这个语句update test set x=1 where y=1;
首先Oracle会利用一致读找到所有y=1的数据行,因此就算读取期间有别的会话修改了某一行的y值(如从y=1变为 y=2),
Oracle也会利用undo数据将该行的y列恢复到读取的那个时刻的值(即y=1),所以这一行还是会被读取。然后,当要实际更新这一行的时候,
Oracle会利用当前读去获取数据块的最新版本,由于被提交过了,所以读到的y值是2,与之前一致读中的y=1不符。
所以Oracle就知道了需要 “重启动”这个update操作。

Oracle重启动的流程:
1. 回滚之前的修改操作
2. 进入select for update模式,锁定需要修改的行
3. 对锁定的行进行修改操作
(这个流程是指在Oracle默认的READ COMMITED隔离级别下,如果是SERIALIZABLE模式,则会出现ORA-08177错误)

重启动查看(通过创建触发器来查看)
create table t (x int,y int);
insert into t values(1,1);commit;
create or replace trigger t_buffer before update on t for each row
begin
 dbms_output.put_line ('old.x='||:old.x||',old.y='||:old.y);
 dbms_output.put_line ('new.x='||:old.x||',new.y='||:old.y);
end;

update t set x=x+1 where x>0;
输出结果如下:
old.x=1,old.y=1
new.x=1,new.y=1

在第二个会话中执行
update t set x=x+1 where x>0; --被锁定
将第一个会话中提交后,输出结果如下:
old.x=1,old.y=1
new.x=1,new.y=1
old.x=2,old.y=1
new.x=2,new.y=1

where条件改成y=0也一样 在第一个会话中执行如下语句
update t set x=x+1 where y>0;
old.x=3,old.y=1
new.x=3,new.y=1

在第二个会话中执行
update t set x=x+1 where y>0;
old.x=3,old.y=1
new.x=3,new.y=1
old.x=4,old.y=1
new.x=4,new.y=1

修改触发器如下:
create or replace trigger t_buffer before update on t for each row
begin
 dbms_output.put_line ('已更新');
end;

第一个会话
update t set x=x+1 where x>0;
输出结果:
已更新

第二个会话
update t set x=x+1 where x>0;
输出结果:
已更新
已更新

如果where条件改成y>0,那么就不会引发重启动
第一个会话
update t set x=x+1 where y>0;
输出结果:
已更新

第二个会话
update t set x=x+1 where y>0;
输出结果:
已更新

结果说明:说明:old和:new值在触发器引用时,也会被oracle用于完成重启动检查。where子句中查找行所用的列集会与行触发器中引用的列进行比较,行的一致读版本会与行的当前读版本比较,只要不同,就会重启动修改。
如果 after for each row 触发器比使用 before for each row 触发器更有效,如果使用after for each row 触发器就不会引发重启动问题。

转载于:https://www.cnblogs.com/lanzi/archive/2011/01/13/1934708.html

oracle发生重启动的介绍相关推荐

  1. 深入解析:你听说过Oracle数据库的更新重启动吗?

    关注"数据和云",精彩不容错过 杨廷琨 云和恩墨高级咨询顾问, ITPUB Oracle 数据库管理版版主 ,人称 "杨长老",十数年如一日坚持进行 Oracl ...

  2. DBA必知的170张Oracle常用动态性能表介绍

     DBA必知的170张Oracle常用动态性能表介绍 常用动态性能表.pdf 附录C 动态性能(V$)视图 本附录介绍动态性能视图.这些视图一般作为V$视图引用.本附录包括下列内容: ???? 动态性 ...

  3. 数据库事务隔离级ORACLE数据库事务隔离级别介绍

    本文系转载,原文地址:http://singo107.iteye.com/blog/1175084 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committ ...

  4. oracle服务未启动失败,windows服务未启动导致 ORA-12560和RMAN-00554错误 | 信春哥,系统稳,闭眼上线不回滚!...

    今天,有人在群里问RMAN-00554.RMAN-04005.ORA-12560错误,如下: C:Usersstream>rman target / 恢复管理器: Release 11.2.0. ...

  5. 【Oracle】RAC11gR2Grid启动顺序及启动故障诊断思路

    转自:https://www.2cto.com/database/201605/507269.html 图片来自:https://blog.csdn.net/zwjzqqb/article/detai ...

  6. oracle禁用ctss,CTSS服务介绍及模式调整

    2,333 total views, 2 views today 一.CTSS介绍 CTSS是Oracle集群软件的一部分,如果发现OS时间同步有效或者中断,那么CTSS以observer观察者模式运 ...

  7. 2. Oracle 数据库实例启动关闭过程

    转载自: http://blog.csdn.net/leshami/article/details/5542983 Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行 ...

  8. Oracle基础知识-Oracle不同的启动关闭方式

    Oracle中不同启动和关闭方式的区别 Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将周详介绍这些启动和关闭方式之间的区别连同他们各自不同的功能. 一.启动和关闭Oracle数据库 对 ...

  9. Oracle 数据库实例启动关闭过程

    --================================ -->Oracle 数据库实例启动关闭过程 --================================ /* Or ...

最新文章

  1. WEB浏览器兼容(转)
  2. 一文让你搞懂YOLO难关!
  3. SQLHELPER C#
  4. 【OpenSSL】OpenSSL之SHA
  5. 一文讲清,MySQL如何解决多事务并发问题
  6. 【吴恩达课后编程作业pytorch实现】Keras入门与残差网络的搭建【1】
  7. JavaWeb——拦截器HandlerInterceptor
  8. HCIE-Security Day30:IPSec:实验(五)配置基于路由的IPSec PN(采用预共享密钥认证)
  9. php正则去掉空格,PHP怎么实现正则去掉空格
  10. 安全测试(初测)报告
  11. 【解决办法】ES文件浏览器无法播放该链接
  12. Original error: Error executing adbExec
  13. 华为老员工谈华为终端的来龙去脉
  14. python饼图添加颜色_Python中的五颜六色的饼状图!(二)
  15. Pycharm 快捷键 整理
  16. 国家基金申请书撰写的共性问题(转)
  17. Geophysics背景知识(2)
  18. linux环境变量设置图解,Ubuntu Linux 各个环境变量配置文件详解, 环境变量PATH设置...
  19. 基于jsp+mysql+Spring+SpringMVC+mybatis的爱康医院专家预约管理系统
  20. LDPC的两种常用译码算法

热门文章

  1. 传统行业生意,现在想要发财
  2. 什么样的领导会给公司造成损失呢?
  3. 应届生找工作是首先选择一个公司,还是选择一个行业?
  4. Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
  5. IPV6 Socket编程
  6. ssis组件_SSIS脚本组件概述
  7. 李菲菲贡献_贡献,贡献,贡献!
  8. powerbi发布本地_PowerBI中本地数据的注意事项
  9. RaspberryPi(一)
  10. 51单片机复习:外部中断,定时器/计数器中断