首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 事務深度解析:ACID 特性、隔離級別、鎖機制、保存點與最佳實踐

     編輯:MySQL 綜合教學

事務本質與 ACID

事務 = 一組 SQL 的原子提交單元。要麼全做,要麼全不做。

特性核心含義MySQL 實現機制
原子性 (Atomicity)不可分割,全成功或全回滾Undo Log 記錄反向操作,Crash Recovery 回滾未提交事務
一致性 (Consistency)約束/觸發器/業務規則滿足,數據庫從一個一致狀態轉移到另一個Undo/Redo Log + 二進制日誌 + 雙寫緩衝區保證崩潰恢復一致性
隔離性 (Isolation)併發事務互不干擾,視如串行執行MVCC (多版本併發控制) + 行鎖/間隙鎖/Next-Key Lock
持久性 (Durability)提交後永久生效,不怕掉電/崩潰Redo Log (WAL) + sync_binlog=1 + innodb_flush_log_at_trx_commit=1

存儲引擎事務支援

  • InnoDB:完整 ACID、行級鎖、MVCC、生產首選。
  • BDB:已棄用 (MySQL 5.1 移除)。
  • MyISAM/MEMORY:不支援事務,僅支援表級鎖模擬 (LOCK TABLES),無崩潰恢復能力。

事務控制語句


-- 1. 關閉自動提交 (會話級)
SET @@autocommit = 0;

-- 2. 顯式開始 (二者等價)
START TRANSACTION;  -- 標準 SQL,支援 READ ONLY/READ WRITE、ISOLATION LEVEL
BEGIN WORK;         -- MySQL 擴展

-- 3. 提交
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE];
-- CHAIN: 提交後自動啟動同隔離級事務
-- RELEASE: 提交後斷開連接

-- 4. 回滾
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE];

-- 5. 保存點 (部分回滾)
SAVEPOINT sp1;
-- ... SQL ...
ROLLBACK TO SAVEPOINT sp1;  -- 撤銷 sp1 後的操作,sp1 保留
RELEASE SAVEPOINT sp1;      -- 釋放保存點

隱式提交陷阱 (DDL 導致事務提交)

以下語句會強制 COMMIT 當前事務,不可在事務中混用:

  • DDL:CREATE/DROP/ALTER/TRUNCATE/RENAME DATABASE/TABLE/INDEX/VIEW
  • 鎖表:LOCK TABLES / UNLOCK TABLES
  • 設置:SET autocommit = 1
  • 備份:BACKUP TABLE (棄用)

後果:事務邊界被打破,原子性失效。

隔離級別深度解析 (InnoDB 默認 REPEATABLE READ)

級別臟讀不可重複讀幻讀InnoDB 實現性能/併發
READ UNCOMMITTEDYYY無鎖讀最新版本最高/最低安全
READ COMMITTEDNYYRead View 每語句刷新、行鎖高/中
REPEATABLE READ (默認)NNN* (Next-Key Lock 防幻)Read View 事務首語句建立、Next-Key Lock中/高
SERIALIZABLENNN隱式共享鎖 (SELECT → LOCK IN SHARE MODE)最低/最高安全

幻讀細節:RR 級別下,純 SELECT (快照讀) 可重複讀,但 SELECT ... FOR UPDATE / LOCK IN SHARE MODE (當前讀) + 範圍查詢會加 Next-Key Lock 防止幻讀寫入。

設置隔離級別


-- 會話級 (當前連接)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 全局級 (新連接生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 查看
SELECT @@transaction_isolation, @@session.transaction_isolation;

鎖機制與併發控制

鎖類型粒度模式兼容性典型場景
記錄鎖單行X/SX-X/X-S/S-S 冲突PK/UK 精確匹配
間隙鎖區間GAP只阻礙插入,不阻礙讀範圍查詢防止幻讀
Next-Key Lock記錄+間隙XRecord+Gap 組合RR 級範圍當前讀
插入意向鎖間隙INSERT與 GAP 衝突,等待 GAP 釋放INSERT 時自動獲取
自增鎖表級AUTO-INC串行化自增分配INSERT ... AUTO_INCREMENT

死鎖與排查

  • InnoDB 自動檢測死鎖 (等待圖),回滾代價最小事務 (權重:修改行數、鎖數),返回 ERROR 1213 (40001)。
  • 排查:SHOW ENGINE INNODB STATUS\G → LATEST DETECTED DEADLOCK 區塊,分析雙方持有/等待鎖、SQL 文本。
  • 預防:統一多表操作順序、縮短事務、避免長事務、索引優化減少掃描鎖行。

最佳實踐清單

  1. 事務邊界最小化:只包含必須原子的寫操作,讀操作 (報表/查詢) 移出事務,使用只讀副本。
  2. 異常處理必須回滾:應用層 try { tx.commit() } catch { tx.rollback() } finally { close() }。
  3. 避免長事務:超過 5 秒即為長事務,導致 Undo Log 膨脹、鎖持久、主從延遲、備份一致性困難。
  4. 保存點用於嵌套邏輯:批量導入分批次,每批 SAVEPOINT,失敗回滾單批不影響前批。
  5. 隔離級別選型:默認 RR 適配 90%+ 場景;高併發讀多寫少可改 RC 減少間隙鎖衝突 (需評估幻讀風險);嚴格金融對賬可用 Serializable。
  6. 持久性參數雙 1:innodb_flush_log_at_trx_commit=1 + sync_binlog=1,單點故障零數據丟失 (犧牲 30-50% 寫入吞吐)。
  7. 監控指標:Innodb_row_lock_waits、Innodb_row_lock_time_avg、Trx_rseg_history_len (Undo 積壓)、innodb_trx 活躍事務列表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved