rowid、ora_rowscn都是oracle表中的伪列。
一、rowid
rowid记录的是该行的物理位置,所以查询速度上比索引还要快。它的值绝对不会重复。
rowid的组成:
数据对象编号 文件编号 块编号 行编号 OOOOOO FFF BBBBBB RRR
详细情况:
http://blog.csdn.net/haiross/article/details/15338061
http://blog.chinaunix.net/uid-23622436-id-3204694.html
二、ora_rowscn
表示每条记录所在块的最后一次修改时间。在同一块中,所有记录的ora_rowscn值是一样的,而且只要有一条记录修改后,该块内所有记录的ora_rowscn都会改变。
select ora_rowscn, empno from emp; ORA_ROWSCN EMPNO ---------- ---------- 7948156 1 8074042 101 8110067 7369 8110067 7499 8110067 7521 8110067 7566 8110067 7654 8110067 7698 8110067 7782 8110067 7788 8110067 7839 8110067 7844 8110067 7876 8110067 7900 8110067 7902 8110067 7934 8110067 9527 8110067 98 8110067 99 8110067 102 update emp set empno = 103 where empno = 102; select ora_rowscn, empno from emp; ORA_ROWSCN EMPNO ---------- ---------- 7948156 1 8074042 101 8110343 7369 8110343 7499 8110343 7521 8110343 7566 8110343 7654 8110343 7698 8110343 7782 8110343 7788 8110343 7839 8110343 7844 8110343 7876 8110343 7900 8110343 7902 8110343 7934 8110343 9527 8110343 98 8110343 99 8110343 103
和empno为103的记录所在位置同一块中的其它记录,ora_rowscn都从8110067变为8110343。
默认的情况下,每个块中所有的记录的ora_rowscn都是相同的,当块中任意一条记录发生改变的情况下,块中所有记录的ora_rowscn都会变化为最新值,ora_rowscn的最小粒度是块。
rowid和ora_rowscn有什么用?
可以用来delete和update记录。
DELETE FROM EMP WHERE ROWID = 'AAAFl4AAEAAAAFvAAP' AND ORA_ROWSCN = '7789900';
UPDATE EMP SET HIREDATE = TO_DATE('1986-01-01 02:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE ROWID = 'AAAFl4AAEAAAAFvAAR' AND ORA_ROWSCN = '7790135';
1、在一个没有主键的表中可以使用rowid来删除一条记录。
2、使用ora_rowscn来实现乐观锁。要打开行级的ora_rowscn,默认是块级的。
三、乐观锁和悲观锁
悲观锁就是使用select … for update加锁,在更新前加锁,使得记录只能由一个事务修改。事务退出时释放锁。
乐观锁就是通过一个时间戳,先select获取时间戳,update时判断时间戳是否和取记录时的一样,即记录未被修改过。
参考资料:
http://www.blogjava.net/lihao336/archive/2009/09/04/293934.html
http://blog.csdn.net/ivory_lei/article/details/7940117