(5)數(shù)據(jù)庫并發(fā)
Oracle在日志中記錄修改后數(shù)據(jù),而將修改前的數(shù)據(jù)記錄到“回滾段”(ROLLBACKSEGMENT)中。UNDO信息也會(huì)記錄在REDO中,也就是說Oracle會(huì)把修改前的數(shù)據(jù)及其修改后的數(shù)據(jù)都記錄在REDO中,以便實(shí)例失效的時(shí)候進(jìn)行recovery。
當(dāng)一個(gè)應(yīng)用程序?qū)Ρ硪訧nsert、Update和Delete操作進(jìn)行修改時(shí),另外一個(gè)應(yīng)用程序在讀取該表時(shí),會(huì)從回滾段中讀取該表修改前的數(shù)據(jù)。Oracle利用數(shù)據(jù)行上的標(biāo)志位來實(shí)現(xiàn)鎖機(jī)制。Oracle同一時(shí)刻不同的應(yīng)用程序有讀不一致的現(xiàn)象,這是因?yàn)镺racle認(rèn)為一致性指的是在開始讀的時(shí)候的斷片應(yīng)該保持一致,也就是說一直到TRANSACTION的生命周期里,總是能讀到一致的內(nèi)容。Oracle缺省的隔離級(jí)別類似DB2的UR,讀取數(shù)據(jù)和更新不會(huì)互鎖(如果提高Oracle的隔離級(jí)別,也會(huì)產(chǎn)生互鎖問題),但只能讀到已提交的數(shù)據(jù),無法得到最近修改(但暫時(shí)未提交)的版本。Oracle在其所有的隔離級(jí)別(即read committed、serializable以及read-only隔離級(jí)別)下都不會(huì)讀取臟數(shù)據(jù)(在read committed級(jí)別下,會(huì)從回滾段中直接讀取修改前的曾經(jīng)提交過的數(shù)據(jù))。在一些應(yīng)用里,需要讀到最新的數(shù)據(jù),也就是臟數(shù)據(jù)。
在1日的DB2里(DB2 9.7以前)是靠鎖來解決并發(fā)問題的,這是一個(gè)陣營(yíng)。而Oracle在另一個(gè)陣營(yíng),使用MVCC。Oracle叫UNDO。實(shí)踐檢驗(yàn),MVCC勝出。讀臟數(shù)據(jù)沒有太大用處。對(duì)于并發(fā)控制,無論是DB2還是Oracle,都有自己的特色,只要合理地設(shè)計(jì)應(yīng)用并配置好數(shù)據(jù)庫參數(shù),就能夠滿足絕大多數(shù)的需求。