1. 程式人生 > >Undo日誌文件的產生和使用

Undo日誌文件的產生和使用

回滾 一行 之間 文件 回滾事務 由於 事務 時機 我只

Undo 日誌

比如A有200塊錢, B有50 塊錢,現在A要給B轉100塊” 。

(1) 開始事務 T1 (假設T1是個事務的內部編號)

(2) A余額 = A余額 -100

(3) B余額 = B余額 + 100

(4) 提交事務 T1

會對此事務記錄Undo的日誌文件,記錄下事務開始之前的他倆賬號余額:

[開始事務 T1]

[事務T1, A原有余額,200]

[事務T1, B原有余額,50]

如果事務執行到一半掛了,數據庫重啟以後我就根據undo的日誌文件來恢復。

例子:如果第三步還沒執行完就斷電了, 數據庫重啟以後就需要根據undo日誌復原,要是系統恢復的過程中又斷電了,下次重啟再次恢復,此操作擁有冪等性

,重復多少次都沒有問題。

如何判斷哪些事務需要恢復

恢復之後需要在日誌文件中加上一行 [回滾事務 T1] , 這樣下一次恢復就不用再考慮T1這個事務了。

[開始事務 T1]

[事務T1, A原有余額,200]

[事務T1, B原有余額,50]

[提交事務 T1]

Undo日誌文件中不僅僅只有余額, 事務的開始和結束也會記錄,如果我在日誌文件中看到了[提交事務 T1], 或者 [回滾事務 T1], 就表示此事務已經結束,不用再去理會它了, 更不用去恢復。 如果我只看到 [開始事務 T1], 而找不到提交或回滾,那就得恢復。

日誌從緩沖區寫入磁盤的時機

兩條規則:

1. 在最新余額寫入硬盤之前, 一定要先把相關的Undo日誌記錄寫入硬盤。

例如[事務T1, A原有余額,200] 一定要在A的新余額=100寫入硬盤之前寫入。

2. [提交事務 T1] 這樣的Undo日誌記錄一定要在所有的新余額寫入硬盤之後再寫入

操作 數據緩沖區

Undo日誌緩沖區

1

開始事務T1

開始事務T1

2 A余額 = A余額 -100 A新余額:100 事務T1,A原有余額,200
3 把undo日誌緩沖區內容寫入磁盤 ps:此步驟會清空undo日誌緩沖區
4 把A新余額寫入磁盤
5 B余額 = B余額 + 100 B新余額:150
6 把undo日誌緩沖區內容寫入磁盤
7 把B新余額寫入磁盤
8 提交事務T1 提交事務T1
9 把undo日誌緩沖區內容寫入磁盤

情況一:

如果系統在第4步和第5步之間崩潰,A的余額寫入了硬盤,但是B的還沒寫入, Undo日誌看起來是這樣的:

[開始事務 T1]

[事務T1, A原有余額,200]

由於找不到事務結束的日誌, 進行恢復操作, 把A的原有余額給恢復了。

情況二:

如果是在第7步和第8步之間系統崩潰,A和B的最新余額都寫入了硬盤,但是沒有提交事務, 那Undo日誌看起來是這樣的:

[開始事務 T1]

[事務T1, 旺財原有余額,200]

[事務T1, 小強原有余額,50]

由於沒有事務結束的日誌,也需要進行恢復,把A和B的原有余額恢復成200和50

情況三:

如果是在第8步和第9步之間系統崩潰, A和B的最新余額都寫入了硬盤也提交了事務, 但是提交事務的操作沒有寫入Undo 日誌,Undo日誌還是這樣:

[開始事務 T1]

[事務T1, 旺財原有余額,200]

[事務T1, 小強原有余額,50]

由於沒有事務結束的日誌,需要進行恢復,把A和B原有余額恢復成200和50

Undo日誌文件的產生和使用