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