Oracle语句重启动原理

来源:未知 责任编辑:责任编辑 发表时间:2014-02-18 03:27 点击:

Sql代码 
update test set x=1 where y=1; 
delete from test where y=1; 
它是分为两步:
1. 根据where条件找出表中满足更新条件的数据行;
2. 更新步骤1中所找出的数据行的x值。

假如test表很大,update要执行好几分钟,而且在步骤1期间有人将某一行的y值改为2并提交了,那么在步骤2中,这个y=2的行是否还会被更新x列呢?
这种情况下,Oracle会选择“重启动”更新。

其实,Oracle在执行DML语句时,会用到两种不同的方式去读取数据块:
1. 一致读:在“找到”需要修改的数据行时,会采用consistent read
2. 当前读:在“获取”数据块来实际更新数据行时,会采用current read
Oracle就是通过这样来判断是否需要重启动的。

具体到上面的例子中,首先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错误)

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Table函数使用简介
    • Oracle数据库Constraint约束的常用操作及异常处理
    • Bulk Collect性能分析(zz)
    • export/import的使用
    • OCP043第十五讲 Database Security
    • ORACLE10gr2数据导入MySQL方案
    • oracle 让sys用户可以使用isqlplus
    • 在oracle数据库下使用iSQL*Plus DBA访问数据库
    • Oracle行列转换小结
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1