MySQL事務提交流程概述
儲存引擎實現事務的通用方式是基於 redo log 和 undo log。
簡單來說,redo log 記錄事務修改後的資料, undo log 記錄事務前的原始資料。
所以當一個事務執行時實際發生過程簡化描述如下:
先記錄 undo/redo log,確保日誌刷到磁碟上持久儲存。
更新資料記錄,快取操作並非同步刷盤。
提交事務,在 redo log 中寫入 commit 記錄。
在 MySQL 執行事務過程中如果因故障中斷,可以透過 redo log 來重做事務或透過 undo log 來回滾,確保了資料的一致性。
這些都是由事務性儲存引擎來完成的,但 binlog 不在事務儲存引擎範圍內,而是由 MySQL Server 來記錄的。
那麼就必須保證 binlog 資料和 redo log 之間的一致性,所以開啟了 binlog 後實際的事務執行就多了一步,如下:
先記錄 undo/redo log,確保日誌刷到磁碟上持久儲存。
更新資料記錄,快取操作並非同步刷盤。
將事務日誌持久化到 binlog。
提交事務,在 redo log 中寫入commit記錄。
這樣的話,只要 binlog 沒寫成功,整個事務是需要回滾的,而 binlog 寫成功後即使 MySQL Crash 了都可以恢復事務並完成提交。
MySQL是透過WAL方式,來保證資料庫事務的一致性和永續性,即ACID特性中的C(consistent)和D(durability)。
WAL(Write-Ahead Logging)是一種實現事務日誌的標準方法,具體而言就是:
1、修改記錄前,一定要先寫日誌;
2、事務提交過程中,一定要保證日誌先落盤,才能算事務提交完成。
透過WAL方式,在保證事務特性的情況下,可以提高資料庫的效能。
從上述流程可以看出,提交過程中,主要做了4件事情,
1、清理undo段資訊,對於innodb儲存引擎的更新操作來說,undo段需要purge,這裡的purge主要職能是,真正刪除物理記錄。在執行delete或update操作時,實際舊記錄沒有真正刪除,只是在記錄上打了一個標記,而是在事務提交後,purge執行緒真正刪除,釋放物理頁空間。因此,提交過程中會將undo資訊加入purge列表,供purge執行緒處理。
2、釋放鎖資源,mysql透過鎖互斥機制保證不同事務不同時操作一條記錄,事務執行後才會真正釋放所有鎖資源,並喚醒等待其鎖資源的其他事務;
3、刷redo日誌,前面我們說到,mysql實現事務一致性和永續性的機制。透過redo日誌落盤操作,保證了即使修改的資料頁沒有即使更新到磁碟,只要日誌是完成了,就能保證資料庫的完整性和一致性;
4、清理儲存點列表,每個語句實際都會有一個savepoint(儲存點),儲存點作用是為了可以回滾到事務的任何一個語句執行前的狀態,由於事務都已經提交了,所以儲存點列表可以被清理了。
簡單來說,redo log 記錄事務修改後的資料, undo log 記錄事務前的原始資料。
所以當一個事務執行時實際發生過程簡化描述如下:
先記錄 undo/redo log,確保日誌刷到磁碟上持久儲存。
更新資料記錄,快取操作並非同步刷盤。
提交事務,在 redo log 中寫入 commit 記錄。
在 MySQL 執行事務過程中如果因故障中斷,可以透過 redo log 來重做事務或透過 undo log 來回滾,確保了資料的一致性。
這些都是由事務性儲存引擎來完成的,但 binlog 不在事務儲存引擎範圍內,而是由 MySQL Server 來記錄的。
那麼就必須保證 binlog 資料和 redo log 之間的一致性,所以開啟了 binlog 後實際的事務執行就多了一步,如下:
先記錄 undo/redo log,確保日誌刷到磁碟上持久儲存。
更新資料記錄,快取操作並非同步刷盤。
將事務日誌持久化到 binlog。
提交事務,在 redo log 中寫入commit記錄。
這樣的話,只要 binlog 沒寫成功,整個事務是需要回滾的,而 binlog 寫成功後即使 MySQL Crash 了都可以恢復事務並完成提交。
MySQL是透過WAL方式,來保證資料庫事務的一致性和永續性,即ACID特性中的C(consistent)和D(durability)。
WAL(Write-Ahead Logging)是一種實現事務日誌的標準方法,具體而言就是:
1、修改記錄前,一定要先寫日誌;
2、事務提交過程中,一定要保證日誌先落盤,才能算事務提交完成。
透過WAL方式,在保證事務特性的情況下,可以提高資料庫的效能。
從上述流程可以看出,提交過程中,主要做了4件事情,
1、清理undo段資訊,對於innodb儲存引擎的更新操作來說,undo段需要purge,這裡的purge主要職能是,真正刪除物理記錄。在執行delete或update操作時,實際舊記錄沒有真正刪除,只是在記錄上打了一個標記,而是在事務提交後,purge執行緒真正刪除,釋放物理頁空間。因此,提交過程中會將undo資訊加入purge列表,供purge執行緒處理。
2、釋放鎖資源,mysql透過鎖互斥機制保證不同事務不同時操作一條記錄,事務執行後才會真正釋放所有鎖資源,並喚醒等待其鎖資源的其他事務;
3、刷redo日誌,前面我們說到,mysql實現事務一致性和永續性的機制。透過redo日誌落盤操作,保證了即使修改的資料頁沒有即使更新到磁碟,只要日誌是完成了,就能保證資料庫的完整性和一致性;
4、清理儲存點列表,每個語句實際都會有一個savepoint(儲存點),儲存點作用是為了可以回滾到事務的任何一個語句執行前的狀態,由於事務都已經提交了,所以儲存點列表可以被清理了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2134411/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 第15節:MySQL層事務提交流程簡析MySql
- 十五:MySQL層事務提交流程簡析(筆記)MySql筆記
- MySQL事務兩段式提交MySql
- MySQL 事務提交過程MySql
- MySQl事務建立,開始以及提交MySql
- 檢視mysql沒提交的事務MySql
- Mycat分散式事務兩階段提交過程概述分散式
- 探究MySQL的DML提交事務的意義和DQL是否有必要提交事務MySql
- MySQL:begin後事務為什麼不提交MySql
- MySQL實現事務的提交和回滾MySql
- mysql隱式提交事務transaction一點筆記MySql筆記
- MySQL事務提交的三個階段介紹MySql
- 分散式事務概述分散式
- ORACLE事務管理概述Oracle
- mysql 5.5 lock tables與隱式事務提交commitMySqlMIT
- java 事務提交/回滾Java
- SQL Server 查出未提交事務(長事務)SQLSQLServer
- MySQL事務還沒提交,Canal就能讀到訊息了?MySql
- 一文帶你深度解析MySQL 8.0事務提交原理MySql
- vitess兩階段提交事務Vite
- 架構設計 | 基於電商交易流程,圖解TCC事務分段提交架構圖解
- mysql 事務MySql
- mysql事務MySql
- PostgreSQL 原始碼解讀(122)- MVCC#7(提交事務-整體流程)SQL原始碼MVCC#
- 未提交事務造成的等待事件事件
- Spring中的事務提交事件Spring事件
- MySQL事務(一)認識事務MySql
- MySQL通過performance_schema定位未提交事務所執行的SQLMySqlORM
- MySQL 核心模組揭秘 | 06 期 | 事務提交之前,binlog 寫到哪裡?MySql
- MySQL--事務MySql
- MySQL-事務MySql
- MySQL--->事務MySql
- MySQL 三 事務MySql
- MySQL索引事務MySql索引
- MySQL 事務操作MySql
- Entity Framework中 批量提交 事務處理Framework
- @Transactional註解管理事務和手動提交事務
- Fescar - RM 全域性事務提交回滾流程