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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM