比如我现在有一个回滚表空间,设置为10M.那么我现在做了很多批量的操作,这些操作都没有提交,且操作的大小刚好为10M,即和回滚表空间一样大.那么此时,我进行了一个查询,这个查询的时间为5秒,查询的正好是我操作的这些语句,那么实际上Oracle取数据的时候应该从回滚表空间取.
正在我查询到第3秒时,又有用户进行了一个批量的delete操作,这些操作所占大小为1M,此时回滚表空间的位置已经占满了,而且都是active的状态,即未提交的事务,但是由于有新的删除,需要覆盖撤消段1M的空间.但是我这个SQL查询的是这个撤消表空间中的10M的数据,此时由于被覆盖了1M,那么会差1M的数据.问当我5秒查询结束时,这个查询中是不是有脏数据?

解决方案 »

  1.   

    另外的用户操作表的数据不影响先前用户的dml语句 ,
    后面的用户操作的数据也只是先前表里面存在的数据 又不是你前面用户的数据,
      

  2.   

    1, 回滚段一般都是自动扩展的;
    2,我没测试过,但如你所言的情况不外有两个可能,如果你的回滚段不可扩展,且覆盖时间未到,你新的delete估计会被阻塞;如果不能阻塞,而强行覆盖了回滚段的内容,应该会报ora-01555错误,提示快照太旧
      

  3.   

    是的,提示error: snapshot too old.
      

  4.   

    感谢所有朋友的回答,但是我觉得1楼和2楼都是这么高的级别的专业数据库人士,回答出这种骗小孩的说法,真的是让人觉得很不可礼遇,并且连题目都没理解清楚.3楼描述很详细,大概就是这个意思,我也从网上找到了答案,如果未提交的数据把回滚段装满,此时有新的事务,那么数据库会报回滚表空间不够的错误.或者一个大事务还没执行完,回滚表空间就满了,也会报此错误.另外如果在大查询的过程中,如果一个事务提交了,而查询正好要用到这个提交事务的旧数据,那么会从回滚表空间中找,但是此时又有一个大的事务把刚commit的数据覆盖了,数据库会报ORA-01555错误,归根结底就是回滚表空间太小.我描述的就是上述的情况.谢谢回答,结贴.