询问一个关于一致性读的问题

[复制链接]
查看11 | 回复8 | 2014-4-17 11:38:13 | 显示全部楼层 |阅读模式
小弟学习oracle不久,所以对于有些概念不太了解,想请教一下大家,问题如下:如果有两个会话A和B如果A在查询的时候,B在对对数据尽心update操作,此时A的查询会通过SCN的大小来确定它所要读取的数据是从buffer中还是从回滚段中读,但是如果B在update完以后并进行了commit,那么此时A再查询它其实不会再从回滚段读了,所以我想问问,此时如果还是根据SCN来判断的话,它怎么就不会去找回滚段了呢?其中是不是还有别的判断机制?问题愚昧,还请大家不吝赐教!
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
最初由 yaky 发布
[B]小弟学习oracle不久,所以对于有些概念不太了解,想请教一下大家,问题如下:如果有两个会话A和B如果A在查询的时候,B在对对数据尽心update操作,此时A的查询会通过SCN的大小来确定它所要读取的数据是从buffer中还是从回滚段中读,但是如果B在update完以后并进行了commit,那么此时A再查询它其实不会再从回滚段读了,所以我想问问,此时如果还是根据SCN来判断的话,它怎么就不会去找回滚段了呢?其中是不是还有别的判断机制?问题愚昧,还请大家不吝赐教! [/B]

A还是会从回滚段里面读数据,只要他开始查询时的SCN小于COMMIT后的SCN,那么它读取数据还是从回滚段里面读,查询的参照时间是以开始查询的时间点为准,而不会去管其他会话的DML对数据产生更改了。还有一个问题就是ora-01555的产生,如果B COMMIT后,ORACLE把回滚块给重用了,而A的查询又需要从回滚里面读数据,此时数据又被别的事务给重用了,这时候就会报ora-01555的错误。
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
那么我想再问问,是不是一个会话从建立开始它的SCN是不变的呢?如果一个会话的时间持续的很长,是不是就越可能发生ora-01555的情况呢?
还有能否描述一下scn和commit scn有什么区别吗?
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
最初由 yaky 发布
[B]那么我想再问问,是不是一个会话从建立开始它的SCN是不变的呢?如果一个会话的时间持续的很长,是不是就越可能发生ora-01555的情况呢?
还有能否描述一下scn和commit scn有什么区别吗? [/B]

SCN严格意义来说不是针对会话的,是基于事务而言的,如果会话没有产生事务的话,那么SCN是不会变的,如果有产生DML操作则会增加SCN。SCN的概念简单理解为对数据库的更改就会加1,因此无所谓COMMIT SCN和SCN的区别,我上面说的只是用于说明清楚而已。ora-01555的产生也不一定跟会话时间长有关系,当然也有受影响,主要是跟回滚段的数量、大小有关系,还有ORACLE的分配。
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
我同时打开了两个会话,两个都同时查一张表,查完后,我在一个会话中用update更改了这个表,然后commit,此时我再用另一个会话查这个表,发现数据已经修改过来了,如果按照blue_prince10的说法,此时再另一个会话中查询还是读回滚段的话,那岂不是数据看起来还是没变吗?但事实另一个会话马上就觉察到数据的改变了,我想问问它走什么机制能等数据commit后,就不从回滚段读了,谢谢!
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
是不是一个会话从建立开始它的SCN是不变的呢?如果一个会话的时间持续的很长,是不是就越可能发生ora-01555的情况呢?
-------------
会话和SCN从概念上讲没有什么关系。会话持续时间长短和ORA-01555也没有关系。ORA-01555是因为回滚段的使用而产生的。

还有能否描述一下scn和commit scn有什么区别?
--------------
没有什么COMMIT SCN的说法。关于SCN的概念。你可以找一下这里的文档:>。搜索一下。
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
最初由 yaky 发布
[B]我同时打开了两个会话,两个都同时查一张表,查完后,我在一个会话中用update更改了这个表,然后commit,此时我再用另一个会话查这个表,发现数据已经修改过来了,如果按照blue_prince10的说法,此时再另一个会话中查询还是读回滚段的话,那岂不是数据看起来还是没变吗?但事实另一个会话马上就觉察到数据的改变了,我想问问它走什么机制能等数据commit后,就不从回滚段读了,谢谢! [/B]


你先理解这一句:只要他开始查询时的SCN小于COMMIT后的SCN,那么它读取数据还是从回滚段里面读。
如果一个用户的事务提交,SCN为100的话,另一个用户又紧接着去找数据,这个用户的找数据用的SCN应该是100,这个时间就不再去UNDO回滚段找数据了。直接从DB BUFFER找了。
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
我刚才还一直以为scn是和用户的会话有关的,现在知道了,这个scn不是和某个用户会话有关,而是基于事务的,就是在任何会话中,只要本会话或者别的会话做了dml等操作,scn都会自动增加,此时别的会话如果再做新的dml操作的话的,它的scn其实就是以增加后的为准的,而并不是刚登入时的那个scn了,是这样的吗?
回复

使用道具 举报

千问 | 2014-4-17 11:38:13 | 显示全部楼层
最初由 yaky 发布
[B]我刚才还一直以为scn是和用户的会话有关的,现在知道了,这个scn不是和某个用户会话有关,而是基于事务的,就是在任何会话中,只要本会话或者别的会话做了dml等操作,scn都会自动增加,此时别的会话如果再做新的dml操作的话的,它的scn其实就是以增加后的为准的,而并不是刚登入时的那个scn了,是这样的吗? [/B]

对的
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行