| 級別 | 別名 | 可見性 | 典型問題 |
|---|---|---|---|
| READ UNCOMMITTED | Dirty Read | 可見未提交數據 | 髒讀、數據不一致 |
| READ COMMITTED | 僅可見已提交 | 不可重複讀、幻讀 | |
| REPEATABLE READ | 默認 | 事務內快照一致 | 幻讀 (InnoDB Next-Key Lock 緩解) |
| SERIALIZABLE | 串行化 | 性能極差、死鎖率高 |
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
警告:READ UNCOMMITTED 導致數據完整性風險;SERIALIZABLE 嚴重影響性能。
START TRANSACTION; -- 顯式開啟 (隱式 autocommit=0)
COMMIT; -- 提交、釋放鎖
ROLLBACK; -- 回滾、釋放鎖
SAVEPOINT sp_name; -- 設置保存點
ROLLBACK TO SAVEPOINT sp_name; -- 回滾到保存點
RELEASE SAVEPOINT sp_name; -- 釋放保存點
SET TRANSACTION ...; -- 設置隔離級別等屬性
LOCK TABLES ...; -- 表鎖 (隱式提交當前事務,勿在事務中混用)
SET autocommit = 0 (會話級)START TRANSACTION (顯式,推薦,自動隱式 autocommit=0)若已在事務中執行 SET autocommit=0 無效,START TRANSACTION 會隱式提交當前更改並開啟新事務。
CREATE PROCEDURE t_insert_table()
BEGIN
DECLARE t_error INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;
START TRANSACTION;
INSERT INTO t_bom_test(parent_id, child_id) VALUES('C','XXXX');
INSERT INTO t_trigger_test(name, age) VALUES('zhangsan', 34);
IF t_error = 1 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END;
ALTER TABLE / CREATE / DROP / TRUNCATE / RENAME / LOCK TABLES / UNLOCK TABLES
SET AUTOCOMMIT = 1 / START TRANSACTION
-- 以上語句會強制提交當前事務
CREATE PROCEDURE nested_tfer_funds(from_acct, to_acct, amount)
BEGIN
DECLARE txn_error INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET txn_error = 1;
SAVEPOINT sp_tfer;
UPDATE account_balance SET balance = balance - amount WHERE account_id = from_acct;
IF txn_error THEN ROLLBACK TO sp_tfer; SELECT 'Aborted'; END IF;
UPDATE account_balance SET balance = balance + amount WHERE account_id = to_acct;
IF txn_error THEN ROLLBACK TO sp_tfer; SELECT 'Aborted'; END IF;
END;
SELECT * FROM account WHERE id = 1 FOR UPDATE; -- 排他鎖,阻塞其他寫/鎖讀
SELECT * FROM account WHERE id = 1 LOCK IN SHARE MODE; -- 共享鎖,允許並發讀、阻塞寫
ERROR 1213 (40001): Deadlock found| 策略 | 核心邏輯 | 適用場景 |
|---|---|---|
| 悲觀鎖 | 讀時加鎖 (FOR UPDATE),寫時已持有鎖 | 衝突頻繁、等待可接受 |
| 樂觀鎖 | 讀時不加鎖,寫時檢查版本戳/時間戳是否變更 | 衝突稀少、長事務驗證場景 |