举例如下:当我用UPDATE 修改一个数据块,此时的SCN为100,被修改数据块的SCN为88,于是进程到DATA FILE 读取数据块到到DATA BUFFER,并修改其中的数据,并将SCN为88和旧数据放到UNDO TABLESPACE,请问这个时候会修改此数据块的SCN为100吗?是提交之前修改还是提交之后修改?按照本人理解应该是提交之后修改,如果是提交之前修改,那么SELECT 就会看到未提交的数据。请各位大虾指教
调试欢乐多
一般情况下所有数据块中只要有一条记录被更新后,整个数据块对应的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未发生变化!