UPDATE操作和UNDO

shuangoracle發表於2011-01-27

UPDATE T SET COL='A' WHERE COL='B';

1、在SHARED POOL裡解析,從而生成執行計劃。

2、假如根據執行計劃,得出COL='B'的記錄放在10號資料檔案的54號資料塊裡。

3、伺服器程式在BUFFER CACHE裡找到一個可用UNDO資料塊,如果沒有發 現,則到UNDO表空間找一個可用的UNDO資料塊,並調入BUFFER CACHE。假如獲得的UNDO資料塊在10號表空間塊號為24號。

4、將改變前的值B放入24號資料塊裡。

5、由於UNDO塊發生了變化,需要產生重做記錄,假設重做記錄號位120

行號 事務ID FILE# BLOCK# VALUE

120 T1 11 24 B

6、在BUFFER CACHE找到54號資料塊,如果沒有,則到UNDO表空間調入。

7、將改變後的值也就是A放入54號資料塊。

8、由於資料塊發生了變化,於是產生重做記錄,假設重做記錄號為121

行號 事務ID FILE# BLOCK# VALUE

121 T1 10 54 A

9、控制權返回給使用者。

10、當使用者發出COMMIT命令時,觸發LOGWR程式,將120121這兩個重做 記錄寫入聯機日誌檔案,並將54號資料塊和24號資料塊的頭部所記錄的 事務狀態標誌為已提交。然後控制權返回給使用者。

11、此時,5424號資料塊裡UNDO塊並不一定被DBWN寫入資料檔案。只有 在髒資料塊的數量達到一定程度才會被寫入。

12、事務只要被提交或回滾,那麼該事務所使用的UNDO塊就可以被覆蓋。

事務只要被提交或回滾,那麼事務所使用的UNDO塊資料就可以被覆蓋。對於上面的例子來說,當第10步,使用者發出COMMIT命令後,11UNDO塊裡的資料就可以被其它事務所覆蓋。

[@more@]

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

相關文章