加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle解决幻读的理解

发布时间:2020-12-12 14:01:03 所属栏目:百科 来源:网络整理
导读:收藏| [辩论] Oracle解决幻读的理解 [复制链接] stevendba 认证徽章 论坛徽章: 22 电梯直达 1 # 发表于 2015-9-23 12:42 | 只看该作者 本帖最后由 stevendba 于 2015-9-23 12:43 编辑 最近在看《 mysql 技术内幕 innoDB存储引擎 》第二版,第260页有一句话,
收藏|

[辩论]Oracle解决幻读的理解

[复制链接] stevendba 认证徽章 论坛徽章: 22 1#发表于 2015-9-23 12:42| 只看该作者 本帖最后由 stevendba 于 2015-9-23 12:43 编辑

最近在看《mysql技术内幕 innoDB存储引擎》第二版,第260页有一句话,原话是:如Oracle数据库,因为其可能需要在SERIALIZABLE的事务隔离级别下才能解决Phantom Problem。我认为这句话不对。

Oracle默认的事务隔离级别是read commited,在此级别下,通过多版本的控制解决了幻读和不可重复读。说一场景:
假设8:00发起一个select,10s后才能扫描完全表,但在8:01的时候,有事务向这个表中插入了数据且提交了。Oracle是看不到,因为Oracle在扫描表的时候会对比发出时间的SCN(8:00)和block中的SCN,如果发现block scn > 发出select的SCN,此时说明数据块被修改了,就会到undo中构造一致性数据块,从而解决了幻读。
请问,我的理解有没有问题?


  • 本版精华
  • Jonathan Lewis关于CBO的系列文章
  • [翻译]11gR2 新特性:在线版本变更(Edition-Based Redefinition)
  • [翻译]Oracle 12c R2优化器白皮书
  • 【好东西还是留在本版】我多年收藏的各种语言编码规范
  • Oracle PLSQL读取(解析)Excel文档
  • 求反GROUP BY的写法
  • 受lastwinner邀请,尝试作答第三届SQL大赛第一道题
  • 我也玩个游戏,我申请加精,求批准
  • 这几年牛蛙写过的奇葩代码
  • 开发版常见问题集锦

使用道具举报

回复 Naldonado 认证徽章 论坛徽章: 168 2#发表于 2015-9-23 13:25| 只看该作者 "Oracle默认的事务隔离级别是read commited,在此级别下,通过多版本的控制解决了幻读和不可重复读"

不对的,读提交的情况下是允许幻读和不可重复读的。

举报

3# 发表于 2015-9-23 13:27 只看该作者 此外你说的这种情况也不叫幻读,叫一致读。。。

幻读定义:
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的"全部数据行"。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入"一行新数据"。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。

往往跟应用更新全部数据行有关。。。for update来解决

举报

lcpp8 论坛徽章: 34 4# 发表于 2015-9-23 13:55 | 只看该作者 整点查询,1分更新并提交,10分出结果,查询的结果里面不包含1分时更新的数据,这叫一致性读。

举报

5# 发表于 2015-9-23 14:15 只看该作者
Naldonado 发表于 2015-9-23 13:25
"Oracle默认的事务隔离级别是read commited,在此级别下,通过多版本的控制解决了幻读和不可重复读"

不对 ...

你说的是对的,我说的场景与幻读不是一个场景。想想,幻读和不可重复读有没有问题,要看业务。

举报


〇〇 论坛徽章: 397 6#发表于 2015-9-23 19:24来自手机| 只看该作者
lcpp8 发表于 2015-9-23 13:55
整点查询,1分更新并提交,10分出结果,查询的结果里面不包含1分时更新的数据,这叫一致性读。

超过时间出不来,就会出现快照太旧错误 收藏|

[辩论]Oracle解决幻读的理解

[复制链接] stevendba 认证徽章 论坛徽章: 22 1#发表于 2015-9-23 12:42| 只看该作者 假设8:00发起一个select,10s后才能扫描完全表,但在8:01的时候,有事务向这个表中插入了数据且提交了。Oracle是看不到,因为Oracle在扫描表的时候会对比发出时间的SCN(8:00)和block中的SCN,如果发现block scn > 发出select的SCN,此时说明数据块被修改了,就会到undo中构造一致性数据块,从而解决了幻读。
请问,我的理解有没有问题?


  • 本版精华
  • Jonathan Lewis关于CBO的系列文章
  • [翻译]11gR2 新特性:在线版本变更(Edition-Based Redefinition)
  • [翻译]Oracle 12c R2优化器白皮书
  • 【好东西还是留在本版】我多年收藏的各种语言编码规范
  • Oracle PLSQL读取(解析)Excel文档
  • 求反GROUP BY的写法
  • 受lastwinner邀请,尝试作答第三届SQL大赛第一道题
  • 我也玩个游戏,我申请加精,求批准
  • 这几年牛蛙写过的奇葩代码
  • 开发版常见问题集锦

举报

回复 Naldonado 认证徽章 论坛徽章: 168 2#发表于 2015-9-23 13:25| 只看该作者 "Oracle默认的事务隔离级别是read commited,在此级别下,通过多版本的控制解决了幻读和不可重复读"

不对的,读提交的情况下是允许幻读和不可重复读的。 举报

3# 发表于 2015-9-23 13:27 只看该作者 此外你说的这种情况也不叫幻读,叫一致读。。。

幻读定义:
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的"全部数据行"。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入"一行新数据"。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检锁范围为只读,这样就避免了幻读。

往往跟应用更新全部数据行有关。。。for update来解决 举报

lcpp8 论坛徽章: 34 4# 发表于 2015-9-23 13:55 | 只看该作者 整点查询,1分更新并提交,10分出结果,查询的结果里面不包含1分时更新的数据,这叫一致性读。 举报

5# 发表于 2015-9-23 14:15 只看该作者
Naldonado 发表于 2015-9-23 13:25
"Oracle默认的事务隔离级别是read commited,在此级别下,通过多版本的控制解决了幻读和不可重复读"

不对 ...

你说的是对的,我说的场景与幻读不是一个场景。想想,幻读和不可重复读有没有问题,要看业务。 举报


〇〇 论坛徽章: 397 6#发表于 2015-9-23 19:24来自手机|
lcpp8 发表于 2015-9-23 13:55
整点查询,1分更新并提交,10分出结果,查询的结果里面不包含1分时更新的数据,这叫一致性读。
超过时间出不来,就会出现快照太旧错误

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!



    推荐文章
      热点阅读