ORA_ROWSCN與按照commit時間對記錄進行排序

zhang41082發表於2019-06-03

問題的提出:
在併發的環境下,每個sql先執行的不一定先提交,因此想如何才能按照事務提交的順序來對記錄進行排序而不是按照sql執行的時間。

[@more@]


先來說說sysdate或者systimestamp,如果系統中使用這樣的列來記錄每個記錄最後提交的時間,那是錯誤的。而且很多人認為這個時間如果設定為default值,那麼記錄的就是sql執行的時間,其實也是錯誤的。oracle 10.2 版本的concept第388頁有這樣一句話“Default values are included as part of an INSERT statement before the statement is parsed.”因此可以看到,把列的default值設定為預設值,或者insert into table(col1...) values (sysdate,...)的方式最後得到的時間都是sql解析的時間而不是sql執行的時間。
ORA_ROWSCN是oracle 10G版本中提出的概念,是一個偽列,用來記錄資料提交時候的scn,而scn是唯一的,而且scn的先後就是commit的時間的先後(雖然事務commit不是導致scn增長的唯一因素)。因此可以按照這個偽列進行排序,得到的結果就是事務提交的先後進行的排序。
預設的建表方式的ORA_ROWSCN記錄的scn是精確到每個block而不是精確到block中的每個row的,因為ORA_ROWSCN取自data block header的scn。要使用此特性需要使用以下方式建表:create table tab(col1 number) rowdependencies。這樣就可以為每個列儲存自己的scn,需要增加每行資料6個位元組的空間的開銷。
另外,oracle還提供了ORA_ROWSCN到TIMESTAMP的轉換,可以得到每個記錄最後的修改時間,但這個時間和真正的資料發生變化的時間有誤差,誤差在正負3秒(引用自TOM,是否是因為每3秒SCN會刷一次有關呢?有待驗證

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25016/viewspace-921602/,如需轉載,請註明出處,否則將追究法律責任。

相關文章