mysql事務簡述

底層基於redo, undo日誌來做。

undo用於回滾,redo用於down機後恢復數據

redo物理文件名:ib_logfile0和ib_logfile1

eg:
將庫存skuStore從1改成2,假設事務號爲:x需要做的事情如下:
1.begin transaction,有唯一事務id
2.記錄undo log,skuStore=1
3.做事務操作,即設置skustore=2,這裏對應事務x的內存數據會被更改,這時涉及內存操作,真正數據刷盤需要等到commit後並且受刷盤策略影響
4.記錄redo log,即skustore=2 //必須刷盤,這步做完後即使這步後db掛了,重啓時也能恢復
5.commit or rollback,這裏也涉及寫入到事務日誌,即在日誌文件中寫入commit或rollback,表明一個事務的結束。
個人理解一個事務日誌文件,即undo可以記錄在redo日誌中,這樣可以順序寫。

問題:
1.如果第2步掛了怎麼辦?【記錄undo log】
沒做任何東西,所以沒關係
2.第3步掛了?【做事務操作】
走回滾操作,用undo回滾
3.第4步掛了?【記錄redo log】
走回滾操作。
4.第5步掛了?【commit or rollback】
如果事務日誌中沒有結束符【commit或rollback】,走回滾操作。
這裏如果走提交操作會有問題,應用程序如果訪問db,db這時掛了,應用程序這時會接收到異常,通常是認爲事務操作未完成。
而db這塊,如果之後重啓後走正向的commit操作,就會使數據不一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章