標籤:csdn 才幹 讀取 oracle term text 儲存 關注 就會
一. 概述
undo 儲存的是舊資料。比方。你改動了一條記錄將A列abc改動為def。那麼undo裡面儲存的就是abc。目的有兩個:1. 假設你的事務沒有提交。可是已經將A列改動,那麼別人讀取這條資料的時候,不應該可以看到你改動後的內容def,應該還僅僅能看到abc,這個時候就須要去讀取undo,才幹取到abc。
2. 假設你的事務後來失敗,須要將A列由改動過的值def回退到之前的值abc。abc也要從undo裡面去取。
這篇文章。簡要介紹一下讀一致性(也就是別人無法讀取到你改動的未提交的內容)與復原(事務失敗。復原改動記錄)是怎麼實現的。
二. 讀一致性
假如會話1 9:00開啟事務,9:02分會話2改動了一條資料由A改動為了B。接著9:03分會話2又將同一條資料由B改動為C,會話2還沒有提交。會話1 9:04分讀取這條資料,應該讀取到的是A,可是緩衝中這條資料已經被改動成C了。那麼怎麼取到A呢。oracle是這樣處理,在緩衝中找到這條資料。發現這條資料被另外的會話改動了,並且另外一個會話還沒有提交。查看改動時間發現是9:03分,比我會話開啟時間9:00要晚。於是在資料區塊的事務槽中找到 另外一個會話這條改動相應的undo記錄。這個時候會讀取undo塊,假設undo已經被重新整理輸出到磁碟,還須要從磁碟中又一次讀取出來。這個時候找到的是9:03改動相應的undo塊,找到的舊資料是B,假設這條undo記錄是9:00之前。我們就不須要往前找了,可是我們發現是9:03。我們還須要找找這條undo前面是否還有undo(本身undo記錄會記錄上一個undo記錄的地址),我們能找到9:02分那條undo記錄。接著再往前找發現沒有了,那麼9:02分那條undo記錄裡面的舊資料A就是我們要找的資料了。
聽起來好繞,給個圖:
三. 復原
復原就是,事務失敗了。我們須要將這個事務所做的改動全部回退。 說讀一致性的時候,我們主要關注的是找資料所在的單個塊,然後找這個塊全部的undo記錄的一個指標鏈表。從塊開始。一直往後找。直到定位到一個足夠老的undo資料。
那麼復原事實上也類似,復原說的就是事務的曆史。我們須要事務中全部的undo記錄反向排序的指標鏈表。從最後做的改動開始回退。一直回退到事務做的第一個改動。
復原和讀一致性看起來差點兒相同,事實上有一個重要的不同之處。讀一致性,我們是在記憶體中產生一個資料區塊的拷貝,應用undo記錄到該拷貝塊上,一旦完畢相關操作。拿到了舊資料。就會迅速捨棄這個塊拷貝。由於我們的目的是拿到舊資料。並非真的要改變資料。復原就不同,復原是要拿到當前真正的資料區塊。並應用undo記錄來還原。
1. 復原操作的是當前資料區塊,undo應用於當前資料區塊,終於所做的改動是要持久化到磁碟的。而讀一致性是不須要的。
2. 復原操作的是當前資料區塊,所以當我們改變它的時候(復原就是改變),會產生重做(redo),至於會不會產生undo這個沒有驗證。
3. 復原操作不僅跟讀一致性一樣可能須要從磁碟讀取undo資料,還有可能須要從磁碟讀取改動的資料。由於改動的資料假設已經被重新整理輸出到磁碟,還須要又一次從磁碟調出來,然後將其值回退到舊值。假設事務比較長,到最後事務失敗。那代價是很大的。回退須要消耗的時間,跟正常事務的時候差點兒相同,甚至很多其它。
oracle undo 複雜度--oracle核心技術讀書筆記四