MySQL之事務原理深度解析

MySQL之事務原理深度解析

    • 一、事務基礎:ACID特性的本質
      • 1.1 事務的定義與核心作用
      • 1.2 ACID特性的內在聯系
    • 二、原子性與持久性的基石:日志系統
      • 2.1 Undo Log:原子性的實現核心
      • 2.2 Redo Log:持久性的保障
      • 2.3 雙寫緩沖(Double Write Buffer)
    • 三、隔離性的實現:鎖與MVCC的協同
      • 3.1 鎖機制:并發控制的顯式手段
      • 3.2 MVCC:無鎖讀的實現
      • 3.3 隔離級別與鎖/MVCC的關系
    • 四、事務的生命周期:從開啟到提交
      • 4.1 事務狀態機
      • 4.2 關鍵操作解析
        • 4.2.1 事務開啟
        • 4.2.2 保存點(SAVEPOINT)
        • 4.2.3 事務提交
    • 五、隔離級別深度解析:從理論到實踐
      • 5.1 讀已提交(Read Committed)
      • 5.2 可重復讀(Repeatable Read)
      • 5.3 隔離級別選擇建議
    • 六、事務最佳實踐與常見問題
      • 6.1 事務設計原則
      • 6.2 死鎖處理
      • 6.3 性能監控指標

事務是保障數據一致性的核心機制,無論是電商系統的訂單支付,還是金融平臺的轉賬交易,事務都能確保一組操作要么全部成功提交,要么全部回滾,避免出現“部分成功”的不一致狀態。本文我將深入MySQL事務的底層原理,解析ACID特性的實現機制、隔離級別的實現方式以及并發控制的核心邏輯,帶你從原理層面理解事務的工作機制。

一、事務基礎:ACID特性的本質

1.1 事務的定義與核心作用

事務(Transaction)是數據庫操作的最小邏輯單元,由一條或多條SQL語句組成,具有四大核心特性(ACID):

  • 原子性(Atomicity):操作要么全執行,要么全回滾
  • 一致性(Consistency):事務前后數據符合業務規則
  • 隔離性(Isolation):并發事務互不干擾
  • 持久性(Durability):已提交數據永久保存

1.2 ACID特性的內在聯系

確保
原子性
一致性
隔離性
持久性
業務規則保障

二、原子性與持久性的基石:日志系統

2.1 Undo Log:原子性的實現核心

Undo Log記錄事務對數據的修改前狀態,用于回滾操作:

  • 作用:事務回滾時撤銷修改,實現原子性
  • 存儲形式:邏輯日志(記錄SQL操作的反向步驟)
  • 示例
    START TRANSACTION;
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;  -- 記錄undo日志:balance + 100
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;  -- 記錄undo日志:balance - 100
    ROLLBACK;  -- 根據undo日志恢復數據
    

2.2 Redo Log:持久性的保障

Redo Log記錄事務對數據的修改后狀態,用于崩潰恢復:

  • 作用:事務提交后即使崩潰,通過Redo Log恢復數據
  • 兩階段提交
    1. 事務執行時將Redo Log寫入緩沖
    2. 提交時將Redo Log刷盤(fsync)
  • 日志格式:物理日志(記錄數據頁的修改)

2.3 雙寫緩沖(Double Write Buffer)

解決Redo Log刷盤時的部分寫問題:

  1. 數據先寫入共享表空間的雙寫緩沖
  2. 再寫入數據文件
  3. 確保數據頁寫入的原子性

三、隔離性的實現:鎖與MVCC的協同

3.1 鎖機制:并發控制的顯式手段

InnoDB支持兩種行級鎖:

  • 共享鎖(S鎖):允許讀,多個事務可共存
  • 排他鎖(X鎖):允許寫,排斥其他鎖

鎖兼容性矩陣

鎖類型S鎖X鎖
S鎖
X鎖

3.2 MVCC:無鎖讀的實現

多版本并發控制(MVCC)通過版本鏈實現讀-寫不阻塞:

  1. 版本鏈:每行數據維護多個版本(通過隱藏字段trx_idroll_ptr
  2. Read View:事務啟動時生成,記錄當前活躍事務ID集合
  3. 可見性判斷
    • 版本trx_id < 當前最小活躍ID:可見
    • 版本trx_id > 當前最大活躍ID:不可見
    • 否則:判斷是否在活躍事務集合中

3.3 隔離級別與鎖/MVCC的關系

隔離級別臟讀不可重復讀幻讀實現方式
讀未提交無鎖,直接讀取最新數據
讀已提交MVCC(每次讀生成新Read View)
可重復讀MVCC(事務內Read View不變)
串行化強制加鎖,事務串行執行

四、事務的生命周期:從開啟到提交

4.1 事務狀態機

"START TRANSACTION"
"第一條修改語句"
"出現異常"
"執行COMMIT"
"ROLLBACK"
"寫入Redo Log"
活動狀態
部分提交
失敗
提交
已回滾
已提交

4.2 關鍵操作解析

4.2.1 事務開啟
  • 隱式事務:非事務表(如MyISAM)每條語句自動提交
  • 顯式事務:START TRANSACTIONBEGIN開啟
4.2.2 保存點(SAVEPOINT)
START TRANSACTION;
INSERT INTO orders ...;
SAVEPOINT sp1;  -- 創建保存點
UPDATE stock ...;
ROLLBACK TO sp1;  -- 回滾到保存點,不影響之前的INSERT
COMMIT;
4.2.3 事務提交
  • InnoDB:將Redo Log刷盤,釋放鎖資源
  • MyISAM:無事務支持,直接寫入表文件

五、隔離級別深度解析:從理論到實踐

5.1 讀已提交(Read Committed)

實現

  • 每次SELECT生成新的Read View
  • 解決臟讀,存在不可重復讀
  • 適合大多數OLTP場景(如訂單查詢)

示例

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 事務A看到事務B提交后的數據變化

5.2 可重復讀(Repeatable Read)

InnoDB默認級別

  • 事務內Read View不變,避免不可重復讀
  • 通過間隙鎖(Gap Lock)解決幻讀
  • MVCC優化:僅在第一次讀時生成Read View

示例

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 事務A兩次讀取結果一致,即使事務B修改并提交

5.3 隔離級別選擇建議

場景推薦級別原因
高并發讀多寫少讀已提交減少鎖競爭,保證讀性能
金融轉賬可重復讀防止幻讀和不可重復讀
批量數據處理串行化確保嚴格順序執行

六、事務最佳實踐與常見問題

6.1 事務設計原則

  1. 短小高效:避免長事務(如將10萬次更新拆分為100次1000批處理)
  2. 合適隔離級別:非關鍵業務使用讀已提交,敏感業務使用可重復讀
  3. 索引優化:避免無索引導致的鎖升級(行鎖→表鎖)

6.2 死鎖處理

排查步驟

  1. 查看死鎖日志:SHOW ENGINE INNODB STATUS
  2. 分析死鎖語句:檢查是否存在索引缺失、鎖順序不一致
  3. 優化方案:
    • 按相同順序訪問資源
    • 減少鎖持有時間

6.3 性能監控指標

-- 查看事務相關狀態
SHOW STATUS LIKE 'Innodb_transaction%';
SHOW STATUS LIKE 'Com_commit';
SHOW STATUS LIKE 'Com_rollback';

若這篇內容幫到你,動動手指支持下!關注不迷路,干貨持續輸出!
ヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86628.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JUC:5.start()與run()

這兩個方法都可以使線程進行運行&#xff0c;但是start只能用于第一次運行線程&#xff0c;后續要繼續運行該線程需要使用run()方法。如果多次運行start()方法&#xff0c;會出現報錯。 初次調用線程使用run()方法&#xff0c;無法使線程運行。 如果你對一個 Thread 實例直接調…

微服務中解決高并發問題的不同方法!

如果由于流量大而在短時間內幾乎同時發出請求&#xff0c;或者由于服務器不穩定而需要很長時間來處理請求&#xff0c;并發問題可能會導致數據完整性問題。 示例問題情況 讓我們假設有一個邏輯可以檢索產品的庫存并將庫存減少一個&#xff0c;如上所述。此時&#xff0c;兩個請…

【2025CCF中國開源大會】OpenChain標準實踐:AI時代開源軟件供應鏈安全合規分論壇重磅來襲!

點擊藍字 關注我們 CCF Opensource Development Committee 在AI時代&#xff0c;軟件供應鏈愈發復雜&#xff0c;從操作系統到開發框架&#xff0c;從數據庫到人工智能工具&#xff0c;開源無處不在。AI 與開源生態深度融合&#xff0c;在為軟件行業帶來前所未有的創新效率的同…

[Java實戰]springboot3使用JDK21虛擬線程(四十)

[Java實戰]springboot3使用JDK21虛擬線程(四十) 告別線程池爆滿、內存溢出的噩夢!JDK21 虛擬線程讓高并發連接變得觸手可及。本文將帶你深入實戰,見證虛擬線程如何以極低資源消耗輕松應對高并發壓測。 一、虛擬線程 傳統 Java 線程(平臺線程)與 OS 線程 1:1 綁定,創建和…

SpringBoot 中使用 @Async 實現異步調用?

? ? SpringBoot 中使用 Async 實現異步調用 一、Async 注解的使用場合?二、Async 注解的創建與調試?三、Async 注解的注意事項?四、總結? 在高并發、高性能要求的應用場景下&#xff0c;異步處理能夠顯著提升系統的響應速度和吞吐量。Spring Boot 提供的 Async 注解為開…

CMOS SENSOR HDR場景下MIPI 虛擬端口的使用案例

CMOS SENSOR HDR場景下MIPI 虛擬端口的使用案例 文章目錄 CMOS SENSOR HDR場景下MIPI 虛擬端口的使用案例?? **一、HDR模式下的虛擬通道核心作用**?? **二、典型應用案例****1. 車載多目HDR系統****2. 工業檢測多模態HDR****3. 手機多攝HDR合成**?? **三、實現關鍵技術點…

RJ45 以太網與 5G 的原理解析及區別

一、RJ45 以太網的原理 1. RJ45 接口與以太網的關系 RJ45 是一種標準化的網絡接口&#xff0c;主要用于連接以太網設備&#xff08;如電腦、路由器&#xff09;&#xff0c;其物理形態為 8 針模塊化接口&#xff0c;適配雙絞線&#xff08;如 CAT5、CAT6 網線&#xff09;。以…

valkey之sdscatrepr 函數優化解析

一、函數功能概述 sds sdscatrepr(sds s, const char *p, size_t len)函數的核心功能是將字符串p追加到字符串s中。在追加過程中&#xff0c;它會對字符串p中的字符進行判斷&#xff0c;使用isprint()函數識別不可打印字符&#xff0c;并對這些字符進行轉義處理&#xff0c;確…

MyBatis 緩存機制詳解

MyBatis 緩存機制詳解 MyBatis 提供了強大的緩存機制來提高數據庫訪問性能&#xff0c;主要包括一級緩存和二級緩存兩種。 一級緩存 (Local Cache) 特性&#xff1a; 默認開啟&#xff0c;作用域為 SqlSession 級別同一個 SqlSession 中執行相同的 SQL 查詢時&#xff0c;會…

設計模式精講 Day 13:責任鏈模式(Chain of Responsibility Pattern)

【設計模式精講 Day 13】責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09; 文章內容 在“設計模式精講”系列的第13天&#xff0c;我們將深入講解責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;。這是一種行為型設計模式&#xff0c;…

h-ui面板 hysteria2

搭建文檔 項目地址&#xff1a;https://github.com/jonssonyan/h-ui/blob/main/README_ZH.md參考視頻&#xff1a;https://www.youtube.com/watch?vNi3iaLOsH_A一鍵部署命令 # root權限 sudo -ibash <(curl -fsSL https://raw.githubusercontent.com/jonssonyan/h-ui/mai…

自動登錄腳本神器-Mac電腦實現自動登錄堡壘機并自動輸入賬號密碼跳轉不同機器環境

先講下背景&#xff1a; 公司電腦需要先登錄堡壘機&#xff0c;然后再從堡壘機跳轉到具體生產機器&#xff0c;每次輸入堡壘機都要通過Authenticator里的2FC的碼做驗證&#xff0c;然后再跳到堡壘機還要再輸入一次賬號密碼&#xff0c;為了方便快速登錄機器&#xff0c;可以制…

【C/C++】C++26新特性前瞻:全面解析未來編程

展望未來&#xff1a;C26 新特性全面解析 隨著 C 標準每三年一次的迭代節奏&#xff0c;C26&#xff08;預計于 2026 年底正式發布&#xff09;正在逐步成型。相比 C20 的革命性更新和 C23 的“修補增強”&#xff0c;C26 繼續推進現代 C 的理念——更安全、更高效、更模塊化&…

ArXiv 2101 | Rethinking Interactive Image Segmentation Feature Space Annotation

Rethinking Interactive Image Segmentation Feature Space Annotation Author: lartpangLink: https://github.com/lartpang/blog/issues/10論文&#xff1a;https://arxiv.org/abs/2101.04378代碼&#xff1a;https://github.com/LIDS-UNICAMP/rethinking-interactive-image…

架構經驗總結

20250511-總結經驗 一、SOA 1&#xff09;過程&#xff1a;需求分析、系統設計、系統實現、構件組裝、部署運維、后開發階段。 2&#xff09;特點&#xff1a;無狀態、單一職責、明確定義接口、自包含、模塊化、粗粒度、重用性、兼容性、互操作性、松耦合、策略聲明。 3&…

debain切換 opensuse 我都安裝了什么

綠色進度條后&#xff0c;黑屏&#xff08;只有一個下劃線&#xff09;等待 使用 nomodeset 屬性解決 進入系統無法連接 wifi&#xff0c;只能使用網線連接 wifi 這個我在安裝中文字體后&#xff0c;注銷登錄&#xff0c;得到了解決&#xff0c;不確定是不是字體問題。&#x…

思科ISE/ISE-PIC安全警報:兩處高危RCE漏洞(CVSS 10.0)可致未授權獲取root權限

思科已發布更新&#xff0c;修復身份服務引擎&#xff08;Identity Services Engine&#xff0c;ISE&#xff09;及ISE被動身份連接器&#xff08;ISE-PIC&#xff09;中兩處最高危安全漏洞&#xff0c;這些漏洞可能允許未經認證的攻擊者以root用戶身份執行任意命令。 漏洞詳情…

智能助手(利用GPT搭建智能系統)

項目介紹 本項目旨在打造一個基于通義千問模型的智能助手&#xff0c;能夠理解用戶指令并自動生成可執行的 JavaScript 代碼。該代碼可直接調用預設接口&#xff0c;完成指定操作&#xff0c;并返回執行結果。通過大模型的理解與生成能力&#xff0c;實現從自然語言到接口調用…

【源碼+文檔+調試講解】基于web的運動健康小程序的設計與實現y196

摘 要 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。針對高校教師成果信息管理混亂&#xff0c;出錯率高&#xff0c;信息安全…

臨床項目計劃框架

一、項目概述 1.1 項目名稱 項目名稱:評估XX藥物在YY患者中安全性和有效性的III期隨機對照試驗 1.2 項目背景與立項依據 1.2.1 研究背景 簡述疾病負擔、當前治療現狀、未滿足的醫療需求,為項目開展提供背景支持。 1.2.2 科學依據 總結前期研究結果、理論基礎、研究假設的形…