举例如下:当我用UPDATE 修改一个数据块,此时的SCN为100,被修改数据块的SCN为88,于是进程到DATA FILE 读取数据块到到DATA BUFFER,并修改其中的数据,并将SCN为88和旧数据放到UNDO TABLESPACE,请问这个时候会修改此数据块的SCN为100吗?是提交之前修改还是提交之后修改?按照本人理解应该是提交之后修改,如果是提交之前修改,那么SELECT 就会看到未提交的数据。请各位大虾指教

解决方案 »

  1.   

    SCN是建立再oracle内部系统时钟(scn)上的,每次提交的时候scn便会推进,(scn只会推进不会倒退),
    一般情况下所有数据块中只要有一条记录被更新后,整个数据块对应的scn就会向前推进,但如果表是
    ROWDEPENDENCIES 模式的话只会对具体某一行记录的scn进行更新而已.
    还可以将scn转换成timestamp进行查看<scn_to_timestamp(ORA_ROWSCN)>
     select deptno,dbms_rowid.rowid_block_number(rowid) blockno ,ora_rowscn,scn_to_timestamp(ora_rowscn) from zhbb_dept;使用 ORA_ROWSCN 来检测当前记录是否被修改,它会为每行增加6字节的开销!实现方法:如:
    create table ZHBB_dept
    (deptno, dname, loc, data,
     constraint dept_pk primary key(deptno)
     )
     ROWDEPENDENCIES  --
     as
     select deptno, dname, loc, rpad('*',3500,'*')
     from scott.dept;1.记录当前scn值和块记录数
    select deptno ,dbms_rowid.rowid_block_number(rowid) blockno,ora_rowscn from dept;2.更新dept里面的值;
    3.再次查询scn值和块记录数
     
            会发现更新后的记录对应的ora_rowscn值向前推进,而同一个数据块中未更新的数据scn未发生变化!