天天看點

java redo_redo和undo差別讨論

java redo_redo和undo差別讨論

英文解釋:

名詞:兩種流程,redo重做流程,undo撤銷還原流程;或則是redo日志與undo段的簡稱

動詞:redo即重做,undo即撤銷還原。

翻譯有時候為了簡單,常把動詞和名稱混用。不同場景不同的使用。

1.redo記錄了什麼:

redo即redo日志,記錄資料庫變化的日志(差別我們常見的簡單的文本日志,redo日志裡面記錄的都是資料啊,表資料啊等等壓縮處理,但也很大)。

隻要你修改了資料塊那麼就會記錄redo資訊,當然nologging除外了。

修改的資料塊包括:表所在資料塊(表資料塊),索引所在資料塊(索引資料塊),以及undo段所在資料塊(undo資料塊)!!

2.undo記錄了什麼:

undo即undo段,是指資料庫為了保持讀一緻性,存儲曆史資料在一個位置。

為什麼要保持讀一緻性?

比如有兩個使用者通路資料庫,當然并發羅。A是更改,B是查詢。

--A更改還沒有送出,B查詢的話,資料肯定為曆史資料,這個曆史資料就是來源于UNDO段,

--A更改未送出,需要復原rollback,復原rollback的資料也來至于UNDO段。

結論:為了并發時讀一緻性成功,那麼DML操作,肯定先寫UNDO段。

3.前滾與復原:

--方向相對性:前滾,是指從“以前正常點”往前,一直到崩潰點

復原,是指從“崩潰點”往後,一直到資料一緻性

(因為前滾操作後,由于事務未送出的資料也寫入了“表資料塊”,是以要用Undo資料塊進行覆寫

--詳細解釋:

前滾:

當執行個體崩潰時,可以使用redo從以前正常的點前滾到崩潰點。(前滾從一緻性檢查點,“即當時檢查過所有的SCN是全部一緻的時間點”,一直往前滾到崩潰的時間點)。

當資料庫回到一緻性檢查點時,相當于之後什麼都沒有發生過,資料全被清空了。(穿越了!O(∩_∩)O~)

資料庫隻好根據redo模拟人的操作,使用redo裡的資訊重做(use redo log to redo),構造undo塊,表塊,索引塊等。

復原:

構造的表資料塊中,有已修改的髒資料但未送出,就需要利用前滾中構造的undo資料塊裡的資訊來undo撤銷還原,覆寫復原rollback羅(保持一緻性啊,每種塊裡的scn号都一樣,那麼資料庫就可以打開了)。

4.undo與redo(流程)的聯系:

因為,資料在沒有commit前,是随時從記憶體中寫入到表資料塊的,屬于髒資料。 資料庫崩潰後即使使用redo流程進行redo操作,但是髒資料還在,髒資料怎麼處理,就隻能靠undo流程,使用undo資料塊的舊資料覆寫了。

但是不管是髒的還是舊的,都在redo日志中複制了一份。

注意:1.undo是一種“資料檔案datafile”,具有表空間,當然具有塊block;

2.redo是一種“檔案file”,沒有表空間。

3.資料庫在DML事務時,先建立undo

4.讀一緻性與一緻性(scn相同)的差別

5.undo與rollback的差別:在undo(撤銷還原流程)中會使用rollback(復原)這個動作