transaction:事務(wù)
一個(gè)事務(wù)會(huì)在數(shù)據(jù)庫中申請(qǐng)資源來完成任務(wù)腊尚,事務(wù)或復(fù)雜或簡單吨拗,最后都只有兩個(gè)結(jié)果,事務(wù)成功或者失敗婿斥,成功需要保存事務(wù)更改劝篷,失敗需要恢復(fù)到事務(wù)前的狀態(tài)
redo log:重做日志
在操作一條數(shù)據(jù)之前需要記錄redo log,然后再修改數(shù)據(jù)民宿,以便在數(shù)據(jù)庫出現(xiàn)問題的時(shí)候通過redo log恢復(fù)已經(jīng)提交的數(shù)據(jù)携龟。redo log是為了重現(xiàn)已經(jīng)做過的操作
undo log:撤銷日志
為了保證讀一致性,在更新數(shù)據(jù)到提交之前勘高,Oracle會(huì)先把舊數(shù)據(jù)寫入到undo log中,以便回滾坟桅,且其他用戶讀取的數(shù)據(jù)也是和undo log中的數(shù)據(jù)一致华望,直到提交事務(wù)才更改數(shù)據(jù),undo log是為了撤銷所作更改仅乓。數(shù)據(jù)放在undo表空間中
不管是redo log和undo log都是記錄在內(nèi)存中的赖舟,只要斷電數(shù)據(jù)就會(huì)丟失,一般數(shù)據(jù)庫會(huì)有相應(yīng)機(jī)制把內(nèi)存數(shù)據(jù)寫道磁盤上夸楣,比如幾秒鐘寫一次宾抓,數(shù)據(jù)文件大于1M寫一次,需要注意的是Oracle會(huì)先寫redo log豫喧,因?yàn)閞edo log記錄了整個(gè)事務(wù)完整的操作軌跡石洗,可以用來做數(shù)據(jù)恢復(fù)
對(duì)于Oracle的基本操作,都會(huì)寫相關(guān)的日志紧显,以便做數(shù)據(jù)恢復(fù)讲衫。對(duì)于undo來說,undo log是寫到undo表空間中孵班,事務(wù)沒提交以前涉兽,這些undo segment是active的,不能被別的undo數(shù)據(jù)覆蓋篙程,事務(wù)提交以后才能被別的undo覆蓋枷畏,所以如果執(zhí)行一個(gè)很大的更新或者刪除事務(wù),就會(huì)造成undo不夠用虱饿,一個(gè)解決辦法是加大undo表空間拥诡,還有一個(gè)辦法就是把大事務(wù)拆分成小事務(wù)触趴,比如分批提交。
Oracle分批提交DML
假設(shè)有兩個(gè)表test1和test2袋倔,兩個(gè)表都有一個(gè)ID字段(Primary Key)雕蔽,test1和test2都還有一個(gè)字段cname
上圖中是把需要更新的數(shù)據(jù)放到游標(biāo)中一行一行更新,通過計(jì)數(shù)器實(shí)現(xiàn)更新10000行提交一次宾娜,但是這種寫法pl/sql引擎會(huì)頻繁與數(shù)據(jù)庫交互批狐,update一次交互一次,下面這種方法能較少交互次數(shù)前塔,提高效率(對(duì)于插入操作效率提升更明顯)嚣艇。
參考資料: