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

oracle数据库中,表t1有5000万行数据,用户A执行了一次全表扫描的语句,假设全表扫描一次需要1小时,过了半个小时,用户B修改了第4000万行数据,那么此时被放到回... oracle数据库中,表t1有5000万行数据,用户A执行了一次全表扫描的语句,假设全表扫描一次需要1小时,过了半个小时,用户B修改了第4000万行数据,
那么此时被放到回滚段中的第4000万行数据,是修改前的数据还是修改后的数据?
若B没有commit,A select到的第4000万行数据是不是B修改前的状态?
若B commit后,A才select到第4000万行数据,那这时的数据是B修改前的还是修改后的?
展开
 我来答
liudabener
推荐于2018-04-04 · TA获得超过197个赞
知道答主
回答量:47
采纳率:0%
帮助的人:29.7万
展开全部
  1. B修改了第4000万行数据,被放到回滚段中是修改前的数据。

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

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

百度网友cb7d098
2015-11-19 · TA获得超过175个赞
知道小有建树答主
回答量:110
采纳率:33%
帮助的人:62.2万
展开全部
事务和回滚断的好处就是这样。
首先明白一下整个过程:
当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之后,回滚段存放修改前的数据,用于一致性读。
追问
非常感谢!我明白了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式