事務 = 一組 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 |
-- 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; -- 釋放保存點
以下語句會強制 COMMIT 當前事務,不可在事務中混用:
CREATE/DROP/ALTER/TRUNCATE/RENAME DATABASE/TABLE/INDEX/VIEWLOCK TABLES / UNLOCK TABLESSET autocommit = 1BACKUP TABLE (棄用)後果:事務邊界被打破,原子性失效。
| 級別 | 臟讀 | 不可重複讀 | 幻讀 | InnoDB 實現 | 性能/併發 |
|---|---|---|---|---|---|
| READ UNCOMMITTED | Y | Y | Y | 無鎖讀最新版本 | 最高/最低安全 |
| READ COMMITTED | N | Y | Y | Read View 每語句刷新、行鎖 | 高/中 |
| REPEATABLE READ (默認) | N | N | N* (Next-Key Lock 防幻) | Read View 事務首語句建立、Next-Key Lock | 中/高 |
| SERIALIZABLE | N | N | N | 隱式共享鎖 (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/S | X-X/X-S/S-S 冲突 | PK/UK 精確匹配 |
| 間隙鎖 | 區間 | GAP | 只阻礙插入,不阻礙讀 | 範圍查詢防止幻讀 |
| Next-Key Lock | 記錄+間隙 | X | Record+Gap 組合 | RR 級範圍當前讀 |
| 插入意向鎖 | 間隙 | INSERT | 與 GAP 衝突,等待 GAP 釋放 | INSERT 時自動獲取 |
| 自增鎖 | 表級 | AUTO-INC | 串行化自增分配 | INSERT ... AUTO_INCREMENT |
ERROR 1213 (40001)。SHOW ENGINE INNODB STATUS\G → LATEST DETECTED DEADLOCK 區塊,分析雙方持有/等待鎖、SQL 文本。try { tx.commit() } catch { tx.rollback() } finally { close() }。innodb_flush_log_at_trx_commit=1 + sync_binlog=1,單點故障零數據丟失 (犧牲 30-50% 寫入吞吐)。Innodb_row_lock_waits、Innodb_row_lock_time_avg、Trx_rseg_history_len (Undo 積壓)、innodb_trx 活躍事務列表。