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

MySQL 事務處理完整指南:ACID 特性、隔離級別、鎖機制與最佳實踐

     編輯:MySQL 綜合教學

事務:資料庫一致性的基石

事務處理確保一組 SQL 操作要麼全部成功提交,要麼全部回滾,維護資料庫完整性。僅 InnoDB 引擎支援,MyISAM 不支援顯式事務。

核心術語

術語英文說明
事務Transaction一組作為單一工作單元的 SQL 語句
回滾Rollback撤銷指定 SQL 語句的過程
提交Commit將未儲存的 SQL 結果寫入資料庫表
保存點Savepoint事務中設定的臨時佔位符,可部分回滾

事務控制語句實戰

1. 開始事務

START TRANSACTION;  -- 或 BEGIN; BEGIN WORK;

2. 回滾示例(InnoDB 表)


START TRANSACTION;
DELETE FROM test_inn;
SELECT * FROM test_inn;  -- Empty set
ROLLBACK;
SELECT * FROM test_inn;  -- 資料恢復!
關鍵:若表為 MyISAM,ROLLBACK 無效,資料永久刪除!

3. 顯式提交


START TRANSACTION;
DELETE FROM test_inn;
COMMIT;  -- 永久生效,無法回滾

4. 保存點:部分回滾


START TRANSACTION;
INSERT INTO t VALUES (1);
SAVEPOINT sp1;
INSERT INTO t VALUES (2);
SAVEPOINT sp2;
INSERT INTO t VALUES (3);
ROLLBACK TO sp1;  -- 僅保留第一筆
COMMIT;

5. 關閉自動提交


SET autocommit = 0;  -- 當前連線生效
-- 所有 DML 需顯式 COMMIT/ROLLBACK
SET autocommit = 1;  -- 恢復預設

四大隔離級別與並發異常對比

隔離級別髒讀不可重複讀幻讀鎖策略MySQL 預設
READ UNCOMMITTED✅ 允許✅ 允許✅ 允許無共享鎖否
READ COMMITTED❌ 禁止✅ 允許✅ 允許行鎖+間隙鎖Oracle/PostgreSQL 預設
REPEATABLE READ❌ 禁止❌ 禁止✅ 允許*Next-Key Lock✅ MySQL 預設
SERIALIZABLE❌ 禁止❌ 禁止❌ 禁止表鎖/範圍鎖否

* InnoDB 通過 Next-Key Lock 在 REPEATABLE READ 下很大程度上避免了幻讀。

設定隔離級別


-- 當前會話
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 全域(需重連生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 查看當前
SELECT @@tx_isolation;  -- 5.7+
SELECT @@transaction_isolation;  -- 8.0+

鎖機制與死鎖處理

  • 行鎖:InnoDB 預設,索引條件查詢走行鎖,全表掃描升級為表鎖
  • 間隙鎖:鎖定索引記錄間的「間隙」,防止幻讀
  • Next-Key Lock:行鎖 + 間隙鎖,REPEATABLE READ 預設
  • 死鎖檢測:InnoDB 自動檢測並回滾代價較小的事務
  • 鎖等待超時:innodb_lock_wait_timeout(預設 50s)

最佳實踐檢查清單

  1. ✅ 表引擎確認為 InnoDB
  2. ✅ 事務範圍最小化:只包含必要的 DML,查詢移至事務外
  3. ✅ 以固定順序存取表/行(避免死鎖)
  4. ✅ 避免在事務中進行耗時操作(網路呼叫、複雜計算、大量資料處理)
  5. ✅ 適當使用保存點實現部分回滾
  6. ✅ 監控 innodb_deadlocks、innodb_lock_wait_timeouts 指標
  7. ✅ 明確設定隔離級別而非依賴預設(特別是微服務架構)

事務是資料一致性的最後防線,正確使用才能在高併發下保持系統穩定可靠。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved