首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 事務處理完整指南:InnoDB ACID 特性、鎖行為與最佳實踐

     編輯:MySQL 資料庫相關知識

事務基礎架構

  • 支援引擎:InnoDB、BDB(已棄用)、NDB Cluster
  • MyISAM、MEMORY 不支援 事務
  • 隔離級別預設:REPEATABLE READ(下一節詳解)

核心語法流程

-- 1. 關閉自動提交(關鍵!)
SET AUTOCOMMIT = 0;
-- 或連線參數 init_command=SET AUTOCOMMIT=0

-- 2. 開啟事務
START TRANSACTION;  -- 標準語法,等同 BEGIN

-- 3. 業務操作
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;

-- 4. 提交或回滾
COMMIT;     -- 永久生效
ROLLBACK;   -- 全部撤銷

隱性提交陷阱(DDL 會自動 COMMIT)

Savepoint 部分回滾

START TRANSACTION;
UPDATE account SET balance = balance - 50 WHERE id = 1;
SAVEPOINT sp1;
UPDATE account SET balance = balance - 50 WHERE id = 2;
-- 發現 id=2 餘額不足
ROLLBACK TO SAVEPOINT sp1;  -- 僅撤銷 id=2 扣款
COMMIT;  -- id=1 扣款生效

一致性非鎖定讀(MVCC)

InnoDB REPEATABLE READ 下,普通 SELECT 讀取的是事務啟動時的快照版本,不加鎖、不阻塞寫入。

  • SELECT ... LOCK IN SHARE MODE:共享鎖(S 鎖)
  • SELECT ... FOR UPDATE:排他鎖(X 鎖)

死鎖預防檢查清單

  1. 所有事務固定順序訪問表/行(如按主鍵遞增)
  2. 避免長事務,拆分為多個短事務
  3. 適當使用 SELECT ... FOR UPDATE 提前加鎖
  4. 設定 innodb_lock_wait_timeout = 50(秒),超時自動回滾
  5. 啟用 innodb_print_all_deadlocks = ON 記錄死鎖詳情

效能優化建議

[mysqld]
innodb_flush_log_at_trx_commit = 1   -- 數據安全首選
# 高寫入可折衷 = 2,每秒刷盤一次,崩潰最多丟 1 秒

innodb_log_buffer_size = 64M         -- 大事務減少刷盤
innodb_log_file_size = 1G            -- 減少 checkpoint 頻率
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
語句類別代表指令說明
DDLALTER TABLE, CREATE INDEX, DROP TABLE, TRUNCATE隱性提交當前事務
鎖表LOCK TABLES, UNLOCK TABLES隱性提交
管理SET AUTOCOMMIT=1, START TRANSACTION新事務隱性提交舊事務