Oracle提交和回滾處理

原文地址:http://blog.itpub.net/500314/viewspace-1063652/

1.Commit(提交)
作爲一名開發人員,你應該深入瞭解COMMIT期間會做些什麼。COMMIT通常是一個非常快的操作,而不論事務大小如何。
你可能認爲,一個事務越大(換句話說,它影響的數據越多),COMMIT需要的時間就越長。不是這樣的。不論事務有多大,COMMIT的響應時間一般都很“平”(flat,可以理解爲無高低變化)。這是因爲COMMIT並沒有太多的工作去做,不過它所做的確實至關重要。
有些人認爲限制事務的大小,一塊一塊地提交要比一次性提交要節省系統資源,其實 頻繁的進行事務提交比一次性提交效率要低。我們已經知道,如果不使用綁定變量,而且頻繁地完成硬解析,這會嚴重地降低併發性,原因是存在庫緩存競爭和過量的CPU佔用。即使轉而使用綁定變量,如果過於頻繁地軟解析,也會帶來大量的開銷。COMMIT就是這樣的一種操作(需要進行軟解析),最好根據業務需求來確定事務的大小,而不是錯誤地爲了減少數據庫上的資源使用而“壓縮”事務。
那麼,爲什麼COMMIT的響應時間相當“平”,而不論事務大小呢?在數據庫中執行COMMIT之前,困難的工作都已經做了。我們已經修改了數據庫中的數據,所以99.9%的工作都已經完成。例如,已經發生了以下操作:
a. 已經在SGA中生成了undo塊。
b. 已經在SGA中生成了已修改數據塊。
c. 已經在SGA中生成了對於前兩項的緩存redo。
d. 取決於前三項的大小,以及這些工作花費的時間,前面的每個數據(或某些數據)可能已經刷新輸出到磁盤。(比如redo信息會每隔3S刷新輸出一次)
e. 已經得到了所需的全部鎖。
執行COMMIT時,餘下的工作只是:
a. 爲事務生成一個SCN。如果你還不熟悉SCN,起碼要知道,SCN是Oracle使用的一種簡單的計時機制,用於保證事務的順序,並支持失敗恢復。SCN還用於保證數據庫中的讀一致性和檢查點。可以把SCN看作一個鐘擺,每次有人COMMIT時,SCN都會增1.
b. LGWR將所有餘下的緩存重做日誌條目寫到磁盤,並把SCN記錄到在線重做日誌文件中。這一步就是真正的COMMIT。如果出現了這一步,即已經提交。事務條目會從V$TRANSACTION中“刪除”,這說明我們已經提交。
c. V$LOCK中記錄着我們的會話持有的鎖,這些所都將被釋放,而排隊等待這些鎖的每一個人都會被喚醒,可以繼續完成他們的工作。
d. 如果事務修改的某些塊還在緩衝區緩存中,則會以一種快速的模式訪問並“清理”。塊清除(Block cleanout)是指清除存儲在數據庫塊首部的與鎖相關的信息。實質上講,我們在清除塊上的事務信息,這樣下一個訪問這個塊的人就不用再這麼做了。我們採用一種無需生成重做日誌信息的方式來完成塊清除,這樣可以省去以後的大量工作.
可以看到,處理COMMIT所要做的工作很少。其中耗時最長的操作要算LGWR執行的活動(一般是這樣),因爲這些磁盤寫是物理磁盤I/O。不過,這裏LGWR花費的時間並不會太多,之所以能大幅減少這個操作的時間,原因是LGWR一直在以連續的方式刷新輸出重做日誌緩衝區的內容。在你工作期間,LGWR並非緩存這你做的所有工作;實際上,隨着你的工作的進行,LGWR會在後臺增量式地刷新輸出重做日誌緩衝區的內容。這樣做是爲了避免COMMIT等待很長時間來一次性刷新輸出所有的redo。
2.Rollback
Rollback其實就是commit的逆操作,rollback主要做如下事情:
a. 撤銷已做的所有修改。其完成方式如下:從undo段讀回數據,然後實際上逆向執行前面所做的操作,並將undo條目標記爲已用。如果先前插入了一行,ROLLBACK會將其刪除。如果更新了一行,回滾就會取消更新。如果刪除了一行,回滾將把它再次插入。
b. 會話持有的所有鎖都將釋放,如果有人在排隊等待我們持有的鎖,就會被喚醒。
與此不同,COMMIT只是將重做日誌緩衝區中剩餘的數據刷新到磁盤。與ROLLBACK相比,COMMIT完成的工作非常少。這裏的關鍵是,除非不得已,否則不會希望回滾。回滾操作的開銷很大,因爲你花了大量的時間做工作,還要花大量的時間撤銷這些工作。除非你有把握肯定會COMMIT你的工作,否則乾脆什麼也別做。聽上去這好像是一個常識,這是當然的了,既然不想COMMIT,又何苦去做所有這些工作!不過,我經常看到這樣一些情況:開發人員使用一個“真正”的表作爲臨時表,在其中填入數據,得到這個表的報告,如何回滾,並刪除表中的臨時數據。下一節我會討論真正的臨時表,以及如何避免這個問題。
------------------------------------------------------------------------------------2015.07.30--------------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章