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