一致讀的原理,就是查詢的記錄由查詢的這一時間點決定,後面即便變化了,也要根據回滾保持的前鏡像記錄,取到那個點的數據。ORACLE是如何保證的呢?首先我們要了解兩個情況:
1, SCN:System Change Number。這是一個只會增加不會減少的遞增的數字,存在於ORACLE的最小單位塊裡,但某塊改變時SCN就會遞增。
2,數據庫的回滾段記錄槽,事物槽是用來分配回滾段空間的。如果你更新了某塊,事務就被寫進事務槽裡。如果沒有提交或者回滾,該塊就存在活動事務,數據庫讀到次塊可以識別到這種情況的存在。
因此Oracle在做一致讀的時候,首先是看發起的SCN是否大於當前查詢塊的SCN,如果小於,毫無疑問從回滾段獲取前鏡像數據。如果SCN確實大於當前查詢塊的SCN,還要確保該塊沒有活動事務,否則還是要去前鏡像查找。
所以ORACLE的回滾段既可以回滾數據,又可以保證一致性讀。