commit-提交rollback-回滾,即撤銷對資料的改動,不儲存到資料庫
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.
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,又何苦去做所有這些工作!不過,我經常看到這樣一些情況:開發人員使用乙個「真正」的表作為臨時表,在其中填入資料,得到這個表的報告,如何回滾,並刪除表中的臨時資料。下一節我會討論真正的臨時表,以及如何避免這個問題。
另外參考:
**:
提交事務和回滾事務
9.5 提交事務和回滾事務 提交事務 commit 語句 事務 transaction 測試一下,在mysql中預設的事務行為是怎樣的 mysql預設情況下支援自動提交事務。實際上不符合開發習慣,為了保證資料安全,必須保證同時成功之後再提交 自動提交 每執行一條語句執行一次 怎麼將mysql的自動提...
事務的開啟回滾 提交
mysql use chapter06 database changed mysql create table account id int primary key auto increment,name varchar 40 money float engine innodb query ok,0...
oracle提交後如何回滾
execute執行後 可以回滾 commit提交後 閃回恢復原來的資料 其實oracle提交資料是分兩步操作的,第一步execute執行,第二步commit提交。對應的pl sql也是要先點execute執行,執行後再點commit提交。但是 commit提交後 可以用閃回查詢恢復原來的資料 因為o...