事務基礎架構
- 支援引擎: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)
| 語句類別 | 代表指令 | 說明 |
| DDL | ALTER TABLE, CREATE INDEX, DROP TABLE, TRUNCATE | 隱性提交當前事務 |
| 鎖表 | LOCK TABLES, UNLOCK TABLES | 隱性提交 |
| 管理 | SET AUTOCOMMIT=1, START TRANSACTION | 新事務隱性提交舊事務 |
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 鎖)
死鎖預防檢查清單
- 所有事務固定順序訪問表/行(如按主鍵遞增)
- 避免長事務,拆分為多個短事務
- 適當使用
SELECT ... FOR UPDATE 提前加鎖
- 設定
innodb_lock_wait_timeout = 50(秒),超時自動回滾
- 啟用
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 頻率
- 上一篇文章: MySQL 入門實戰:從建庫建表到資料匯入、多表關聯完整教學
- 下一篇文章: MySQL 資料類型深度解析:TEXT、DATE、SET、ENUM 與通配符實戰
Copyright ©
程式碼之家 All Rights Reserved