oracle数据库中,两个用户同时对表读写的问题。

oracle数据库中,表t1有5000万行数据,用户A执行了一次全表扫描的语句,假设全表扫描一次需要1小时,过了半个小时,用户B修改了第4000万行数据,
那么此时被放到回滚段中的第4000万行数据,是修改前的数据还是修改后的数据?
若B没有commit,A select到的第4000万行数据是不是B修改前的状态?
若B commit后,A才select到第4000万行数据,那这时的数据是B修改前的还是修改后的?

    B修改了第4000万行数据,被放到回滚段中是修改前的数据。

    针对没有commit的事务,基于隔离机制,所有其他进程查询到的数据都是未修改的数据

    针对commit的事务,则需要看发起select事务语句的开始时间点,如果事务开始时间点在commit之后,则肯定查询commit后的数据;如果select事务开始时间点在commit之前,当扫到该条数据时,会去回滚段查找该数据块select事务开始时间点的数据,如果找到了就会使用老数据,如果没有找到,可能会报快照过旧的错误

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-19
事务和回滚断的好处就是这样。
首先明白一下整个过程:
当A在扫表的一瞬间,数据库就会记住现在表的情况,一旦发生更改,也就是你说的用户B,那么更改的数据会放在回滚段中。当A扫描到更改的字段,就会去回滚段去找。保证你查到的数据,就是你发出查询的那一瞬间的表的情况。如果由于事务较多,回滚数据被刷掉,找不到了,那就会遇到经典的ORA1555错误。

至于你问的几个问题“
1, 那么此时被放到回滚段中的第4000万行数据,是修改前的数据还是修改后的数据?

回滚段里面存放修改之前的数据。用于一致性读。

关于2,3问题,首先明确一点,无论B提交不提交,A查询的数据都和B的更改没有任何关系。除非是发生1555错误,那样也是无法得到结果。

2,若B没有commit,A select到的第4000万行数据是不是B修改前的状态?

没有COMMT之前,所有修改的数据,只能在当前的会话中查到。
3,若Bcommit后,A才select到第4000万行数据,那这时的数据是B修改前的还是修改后的?

COMMIT之后,回滚段存放修改前的数据,用于一致性读。追问

非常感谢!我明白了

相似回答