查看: 4109|回复: 6

[SQL] 关于oracle update更新重启动问题

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2018-6-11 23:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. --建表
  2. create table testa(
  3.        id number
  4. );
  5. --初始化数据
  6. select 1
  7.     from dual
  8.   union all
  9.   select 2
  10.     from dual
  11.   union all
  12.   select 3 from dual;
  13. ----testa表的初始化数据
  14. ID
  15. ----------
  16.          1
  17.          2
  18.          3
复制代码


实验1
  
  
  session1
  
  session2
  
  session3
  
   时间1
  
  
  
   update testa set id = 8 where id > 2;
  
  
  
   时间2
  
   update testa set id = id + 0.1;
  
  
  
  
  
   时间3
  
   此update被session2阻塞
  
  
  
  
  
   时间4
  
  
  
  
  
  
  insert into testa values(0.5);
  commit;
  
  
   时间5
  
  
  
   commit;
  
  
  
   时间6
  
  Commit;
  
  
  
  
  



查看testa表结果

ID
----------
       1.1
       2.1
       8.1
       0.5


------------------------------------------------------
实验2
  
  
  session1
  
  session2
  
  session3
  
   时间1
  
  
  
   update testa set id = 8 where id > 2;
  
  
  
   时间2
  
   update testa set id = id + 0.1
  where id > 0;
  
  
  
  
  
   时间3
  
   此update被session2阻塞
  
  
  
  
  
   时间4
  
  
  
  
  
  
  insert into testa values(0.5);
  commit;
  
  
   时间5
  
  
  
   commit;
  
  
  
   时间6
  
  Commit;
  
  
  
  
  


查看testa表结果
      ID
----------
       1.1
       2.1
       8.1
       0.6


实验2把insert语句的内容也更新了!!!是因为实验2 有重启动更新

为什么 实验1 没有重启动更新而实验2有?

实验1中session1在时间6 时 根据当前读拿到 值=8,而一致读的值=3,当前读和一致读不相等,为什么没有重启动更新呢?
求大神解答。。。

论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
2#
发表于 2018-6-14 03:27 | 只看该作者
oracle没有披露在什么情况下会重启DML。你只能够观察->提出假设(比如有WHERE条件且引用的列发生变化)->验证。
即使你验证了也不保证将来的版本还是这样,因为没有文档支持。

使用道具 举报

回复
论坛徽章:
0
3#
 楼主| 发表于 2018-6-14 08:38 | 只看该作者
newkid 发表于 2018-6-14 03:27
oracle没有披露在什么情况下会重启DML。你只能够观察->提出假设(比如有WHERE条件且引用的列发生变化)->验 ...

好吧。其是for each row的触发器也能引起重启动

使用道具 举报

回复
论坛徽章:
223
2010新春纪念徽章
日期:2010-03-01 11:20:51ITPUB元老
日期:2019-04-25 13:46:07至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20管理团队2007贡献徽章
日期:2015-01-19 09:48:272015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04会员2007贡献徽章
日期:2015-02-03 10:26:41
4#
发表于 2018-6-14 10:13 | 只看该作者
newkid 发表于 2018-6-14 03:27
oracle没有披露在什么情况下会重启DML。你只能够观察->提出假设(比如有WHERE条件且引用的列发生变化)->验 ...

顶 大师

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
5#
发表于 2018-6-14 22:27 | 只看该作者
我最早听说重启现象,是在TOM的书中,他用了触发器来做观测工具。如果触发器本身也会引发重启,那不就成了薛定谔的猫?这个触发器里面应该用了写操作破坏某些状态。

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
6#
发表于 2018-7-10 00:19 | 只看该作者
为什么带有WHERE条件的更新操作触发了更新重启动,而不带WHERE条件的更新未触发重启动呢,我是这样理解的:当UPDATE操作包含了WHERE条件,那么这个查询的结果要满足WHERE定义的查询一致性,当更新发现一致性不满足的情况下,就会触发更新重启动。而对于不包含WHERE条件或包含WHERE条件但是该条件与表查询无关的情况,这时Oracle的目标只是将表中所有的数据进行一次更新,并不需要考虑一致性的问题。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
7#
发表于 2018-7-10 04:52 | 只看该作者
稀客稀客!杨兄今日有空来指导?

我在楼主的表基础上增加了一列:
create table testa as select level id,0 num from dual connect by level<=3;

第一个会话不变,第二个执行 update testa set num=id where num =0; 此时被阻塞。第三个改成insert into testa values (0.5,0);
然后第三commit, 第一commit, 此时第二个会话阻塞解除,但是并没有更新第三会话插入的新行,也就是说没有重启。这是怎么回事?难道它判断的是第一个会话有没有修改where里面的列,而不是判断第三个会话有没有插入满足其where的列?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表