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事务开始时间点的数据,如果找到了就会使用老数据,如果没有找到,可能会报快照过旧的错误
非常感谢!我明白了