transaction:事務
一個事務會在數(shù)據(jù)庫中申請資源來完成任務,事務或復雜或簡單,最后都只有兩個結果,事務成功或者失敗,成功需要保存事務更改,失敗需要恢復到事務前的狀態(tài)
redo log:重做日志
在操作一條數(shù)據(jù)之前需要記錄redo log,然后再修改數(shù)據(jù),以便在數(shù)據(jù)庫出現(xiàn)問題的時候通過redo log恢復已經(jīng)提交的數(shù)據(jù)。redo log是為了重現(xiàn)已經(jīng)做過的操作
undo log:撤銷日志
為了保證讀一致性,在更新數(shù)據(jù)到提交之前,Oracle會先把舊數(shù)據(jù)寫入到undo log中,以便回滾,且其他用戶讀取的數(shù)據(jù)也是和undo log中的數(shù)據(jù)一致,直到提交事務才更改數(shù)據(jù),undo log是為了撤銷所作更改。數(shù)據(jù)放在undo表空間中
不管是redo log和undo log都是記錄在內(nèi)存中的,只要斷電數(shù)據(jù)就會丟失,一般數(shù)據(jù)庫會有相應機制把內(nèi)存數(shù)據(jù)寫道磁盤上,比如幾秒鐘寫一次,數(shù)據(jù)文件大于1M寫一次,需要注意的是Oracle會先寫redo log,因為redo log記錄了整個事務完整的操作軌跡,可以用來做數(shù)據(jù)恢復
對于Oracle的基本操作,都會寫相關的日志,以便做數(shù)據(jù)恢復。對于undo來說,undo log是寫到undo表空間中,事務沒提交以前,這些undo segment是active的,不能被別的undo數(shù)據(jù)覆蓋,事務提交以后才能被別的undo覆蓋,所以如果執(zhí)行一個很大的更新或者刪除事務,就會造成undo不夠用,一個解決辦法是加大undo表空間,還有一個辦法就是把大事務拆分成小事務,比如分批提交。
Oracle分批提交DML
假設有兩個表test1和test2,兩個表都有一個ID字段(Primary Key),test1和test2都還有一個字段cname
上圖中是把需要更新的數(shù)據(jù)放到游標中一行一行更新,通過計數(shù)器實現(xiàn)更新10000行提交一次,但是這種寫法pl/sql引擎會頻繁與數(shù)據(jù)庫交互,update一次交互一次,下面這種方法能較少交互次數(shù),提高效率(對于插入操作效率提升更明顯)。
參考資料: