undo日誌 前面學習了redo日誌,redo日誌保證的是崩潰時事務持久性。我們可以從redo日誌恢復到系統崩潰以前。 undo日誌就是為了保證事務回滾時事務所作所為都能回到事務執行前。保證了事務的原子性。redo把我們做增刪改之前的狀態記錄下來,幫助MySQL回滾到事務執行之前的樣子。 這篇文章了 ...
undo日誌
前面學習了redo日誌,redo日誌保證的是崩潰時事務持久性。我們可以從redo日誌恢復到系統崩潰以前。
undo日誌就是為了保證事務回滾時事務所作所為都能回到事務執行前。保證了事務的原子性。redo把我們做增刪改之前的狀態記錄下來,幫助MySQL回滾到事務執行之前的樣子。
這篇文章瞭解一下事務ID和undo日誌產生就OK了,對於Undo日誌存儲可以直接略過。
事務ID
事務兩種類型:只讀事務,讀寫事務。
針對於只讀事務,MySQL會在其對用戶創建的臨時表進行增刪改的時候才會為其分配事務ID,否則不分配。
這裡的臨時表指的是create temporary 表名,和我們使用explain SQL的時候在extra上顯示的using temporary不一樣。前者是用戶創建的用戶臨時表,只針對於當前session有效,後者是MySQL內部臨時表。
而針對於讀寫事務來說,MySQL會在事務執行對某個表進行增刪改的時候為其分配一個事務ID,否則不分配。
事務ID生成
在系統啟動時,系統維護一個全局變數,我們首先從記憶體中找到MAX TRX ID這個值然後加上256,賦給這個全局變數。
每次出現上述情況的事務時會為其分配一個ID,然後變數進行+1操作。
然後每每這個全局變數是256的倍數時候就會對這個變數進行同步修改到系統表空間中的MAX TRX ID屬性處。
然後我們為什麼在取值的時候要加上256呢?主要是因為我們系統關閉是可能已經大於當前MAX TRX ID但是還沒有到256的倍數,所以我們只要將其+256,就會得到一個唯一的事務ID咯。
trx_id隱藏列
我們在介紹數據行的時候就已經提到數據行的三個隱藏列
- row_id 就當我們沒有主鍵或者unique列的時候,會生成一個這個唯一的row_id來保持記錄的唯一性
- trx_id 事務ID
- roll_pointer 後面MVCC的時候介紹,這裡鏈著一個版本鏈