Oracle解决幻读的理解

前端之家收集整理的这篇文章主要介绍了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 | 只看该作者
解决了幻读和不可重复读。说一场景:
假设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相关文章