MYSQL事務回滾的2個問題剖析。本站提示廣大學習愛好者:(MYSQL事務回滾的2個問題剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是MYSQL事務回滾的2個問題剖析正文
因而,正確的原子操作是真正被執行過的。是物理執行。
在以後事務中的確能看到拔出的記載。最後只不過刪除了。但是AUTO_INCREMENT不會應刪除而改動值。
1、為什麼auto_increament沒有回滾?
由於innodb的auto_increament的計數器記載的以後值是保管在存內存中的,並不是存在於磁盤上,當mysql server處於運轉的時分,這個計數值只會隨著insert改增長,不會隨著delete而增加。而當mysql server啟動時,當我們需求去查詢auto_increment計數值時,mysql便會自動執行:SELECT MAX(id) FROM 表名 FOR UPDATE;語句來取得以後auto_increment列的最大值,然後將這個值放到auto_increment計數器中。所以就算 Rollback MySQL的auto_increament計數器也不會作負運算。
2、MySQL的事務對表操作的時分能否是物理操作?
MySQL的事務是有redo和undo的,redo操作的一切信息都是記載到 redo_log中,也就是說當一個事務做commit操作時,需求先把這個事務的操作寫到redo_log中,然後再把這些操作flush到磁盤上,當 呈現毛病時,只需求讀取redo_log,然後再重新flush到磁盤就行了。
而關於undo就比擬費事,MySQL在處置事務時,會在數據共享 表空間裡請求一個段叫做segment段,用保管undo信息,當在處置rollback,不是完完全全的物理undo,而是邏輯undo,就是說會對之 前的操作停止反操作,但是這些共享表空間是不停止回收的。這些表空間的回收需求由mysql的master thread進程來停止回收。