Oracle 有 SCN(系统更改编号):http ://docs.oracle.com/cd/E11882_01/server.112/e10713/transact.htm#CNCPT039
系统更改号 (SCN) 是 Oracle 数据库使用的逻辑内部时间戳。SCN 对数据库中发生的事件进行排序,这是满足事务的 ACID 属性所必需的。Oracle 数据库使用 SCN 来标记 SCN,在该 SCN 之前,所有更改都已知在磁盘上,以便恢复避免应用不必要的重做。数据库还使用 SCN 标记一组数据不存在重做的点,以便可以停止恢复。
SCN 以单调递增的顺序出现。Oracle 数据库可以像使用时钟一样使用 SCN,因为观察到的 SCN 指示一个逻辑时间点,并且重复观察返回相等或更大的值。如果一个事件的 SCN 比另一个事件低,那么它相对于数据库发生在更早的时间。几个事件可能共享同一个 SCN,这意味着它们在数据库中同时发生。
每笔交易都有一个 SCN。例如,如果一个事务更新了一行,那么数据库会记录发生此更新的 SCN。此事务中的其他修改具有相同的 SCN。当事务提交时,数据库会为此提交记录一个 SCN。
使用 ORA_ROWSCN 伪列检查当前的 SCN 行:
http
://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns007.htm#SQLRF51145
示例:
SELECT ora_rowscn, t.* From test t;
演示 --> http://www.sqlfiddle.com/#!4/535bc/1
(在 SQLFiddle 上显式提交显然不起作用 - 在真实数据库上,每次提交都会增加 SCN)。
“真实”数据库的示例:
CREATE TABLE test(
id int,
value int
);
INSERT INTO test VALUES(1,0);
COMMIT;
SELECT ora_rowscn, t.* FROM test t;
ORA_ROWSCN ID VALUE
---------- ---------- ----------
3160728 1 0
UPDATE test SET value = value + 1 WHERE id = 1;
COMMIT;
SELECT ora_rowscn, t.* FROM test t;
ORA_ROWSCN ID VALUE
---------- ---------- ----------
3161657 1 1
UPDATE test SET value = value + 1 WHERE id = 1;
COMMIT;
SELECT ora_rowscn, t.* FROM test t;
ORA_ROWSCN ID VALUE
---------- ---------- ----------
3161695 1 2
如果事务的 SCN 已知,我们可以使用闪回查询来获取该行的过去值:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm#g1026131
示例:
SELECT t.*,
versions_startscn, versions_starttime,
versions_endscn, versions_endtime,
versions_xid, versions_operation
FROM test VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE t;
ID VALUE VERSIONS_STARTSCN VERSIONS_STARTTIME VERSIONS_ENDSCN VERSIONS_ENDTIME VERSIONS_XID VERSIONS_OPERATION
---------- ---------- ----------------- ------------------- --------------- ------------------- ---------------- ------------------
1 2 3161695 13/12/10 08:19:39 06000300EA070000 U
1 1 3161657 13/12/10 08:18:39 3161695 13/12/10 08:19:39 06001200EA070000 U
1 0 3161657 13/12/10 08:18:39
SELECT t.*,
versions_startscn, versions_starttime,
versions_endscn, versions_endtime,
versions_xid, versions_operation
FROM test VERSIONS BETWEEN SCN 3161657 AND 3161657 t;
ID VALUE VERSIONS_STARTSCN VERSIONS_STARTTIME VERSIONS_ENDSCN VERSIONS_ENDTIME VERSIONS_XID VERSIONS_OPERATION
---------- ---------- ----------------- ------------------- --------------- ------------------- ---------------- ------------------
1 1 3161657 13/12/10 08:18:39 06001200EA070000 U