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日誌記錄寫入硬盤。
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日誌文件的產生和使用