微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle解决幻读的理解



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

[复制链接]
认证徽章
论坛徽章:
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中构造一致性数据块,从而解决了幻读。
请问,我的理解有没有问题?


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

不对的,读提交的情况下是允许幻读和不可重复读的。
3#
发表于 2015-9-23 13:27 只看该作者
此外你说的这种情况也不叫幻读,叫一致读。。。

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

往往跟应用更新全部数据行有关。。。for update来解决
论坛徽章:
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解决幻读的理解

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


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

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

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

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

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

论坛徽章:
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分时更新的数据,这叫一致性读。
超过时间出不来,就会出现快照太旧错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐