事務處理確保一組 SQL 操作要麼全部成功提交,要麼全部回滾,維護資料庫完整性。僅 InnoDB 引擎支援,MyISAM 不支援顯式事務。
| 術語 | 英文 | 說明 |
|---|---|---|
| 事務 | Transaction | 一組作為單一工作單元的 SQL 語句 |
| 回滾 | Rollback | 撤銷指定 SQL 語句的過程 |
| 提交 | Commit | 將未儲存的 SQL 結果寫入資料庫表 |
| 保存點 | Savepoint | 事務中設定的臨時佔位符,可部分回滾 |
START TRANSACTION; -- 或 BEGIN; BEGIN WORK;
START TRANSACTION;
DELETE FROM test_inn;
SELECT * FROM test_inn; -- Empty set
ROLLBACK;
SELECT * FROM test_inn; -- 資料恢復!
START TRANSACTION;
DELETE FROM test_inn;
COMMIT; -- 永久生效,無法回滾
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;
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_lock_wait_timeout(預設 50s)innodb_deadlocks、innodb_lock_wait_timeouts 指標事務是資料一致性的最後防線,正確使用才能在高併發下保持系統穩定可靠。