请假各位大侠个问题:Oracle进行DML操作时,是将什么放入了回滚段?如果一个block中有多行记录,是不是这几行都会算作进行了更新操作,而且整个block都被放入了回滚段中呢?从一个事务更新某block中的一行,Oracle将什么放入了回滚段,到另一个事务来更新相同blcok中的不同行,具体是怎样进行检查,怎样进行处理的呢?还请各位大侠指教!!!

解决方案 »

  1.   

    还有是如果是select语句,读相同block中的不同行,会到回滚段中去读取吗?
      

  2.   

    oracle的读写操作都是以快为单位进行的,放入回滚段的也应该是整个快,即使只修改了快中的一个字符。
      

  3.   

    针对不同的dml操作,放入的内容是不同的.
    如果delete,将把整行内容放入回滚段,
    如果是update,将被update字段放入回滚段,
    如果是insert,将对应rowid放入回滚段.
      

  4.   


    谢谢,学习了,但是如果对同一条记录update了2次的话,那么回滚的时候会回滚的哪一次呢?就是如果未提交,第二次update会覆盖第一次update的东西吗?
      

  5.   


    如果这个block中有多行,也是只放入被修改的行吗?还是放入整个block?
    select的话,出于读一致的特点,这时是否认为数据是“旧数据”,在回滚段中读取以前版本?
      

  6.   

    为节省空间,不会把整个块放到回滚,只会放被修改的行.
    select的读一致使通过排他锁实现的,当发现该行被排他锁锁定,则该条数据的读取会从回滚中进行读取.