MySQL--事務回滾機制與原理


 

事務回滾機制

其實,討論MySQL的事務回滾機制,也就是在說MySQL的事務原子性是如何實現的(關於事務之前文章中有過簡單介紹)。

所謂原子性,就是指一個事務是一個不可分割的工作單位,其中的操作要么都做,要么都不做;如果事務中的一個sql語句執行失敗則已執行的語句必須回滾,數據庫會退回到事務前的狀態

我們可以這么理解,就是說如果事務失敗了,那么它對我們的數據庫是沒有任何影響的。

實現原理

在說明原理之前,需要首先介紹一下MySQL的事務日志。

MySQL的日志有很多種,如二進制日志、錯誤日志、查詢日志、慢查詢日志等,此外InnDB引擎還提供了兩種事務日志:redo log(重做日志)和undo log(回滾日志)。

  • 其中redo log用於保證事務持久性;
  • undo log則是事務原子性和隔離性實現的基礎。

我們這里,之所以能夠保證原子性,則是靠undo log。

當事務對數據庫進行修改時,InnDB會生成對應的undo log;如果事務失敗或者調用了rollback,導致事務回滾,便可以利用undo log中的信息將數據回滾到修改之前的樣子。

undo log屬於邏輯日志,它記錄的是sql執行相關的信息當發生回滾時,InnoDB會根據undo log的內容做與之前相反的工作:對於每個insert,回滾時會執行delete;對於每個delete,回滾時會執行insert;對於每個update,回滾時會執行一個相反的update,把數據改回去。

以update操作為例:當事務執行update時,其生成的undo log中會包含被修改行的主鍵(以便知道修改了哪些行)、修改了哪些列、這些列在修改前后的值等信息,回滾時便可以使用這些信息將數據還原到update之前的狀態。

上面這張圖,就比較清晰的表示事務回滾的原理,可以看到,每一步數據的更改都伴隨着回滾日志的產生

所以說我們可以得出以下結論:

    • 每條數據變更操作都伴隨着一條undo log的生成,並且回滾日志必須先於數據持久化到磁盤上。
    • 所謂回滾也就是根據回滾日志做逆向操作。
      回滾過程如下:

 

 

參考:https://blog.csdn.net/m0_49449205/article/details/114988580


免責聲明!

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



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