跟韓學AiOps系列之2025學MySQL系列_如何在MySQL中開啟和提交事務?!
文章目錄
- 一、事務的基本操作
- 1. 開啟事務
- 2. 執行事務內操作
- 3. 提交事務
- 4. 回滾事務
- 二、驗證示例(適用于 MySQL 5.7)
- 步驟 1:準備測試表和數據
- 步驟 2:執行轉賬事務
- 驗證結果
- 三、自動提交模式
- 1. 查看當前自動提交狀態
- 2. 關閉自動提交
- 3. 重新開啟自動提交
- 四、完整示例(含回滾)
- 五、關鍵注意事項
- 六、事務的典型應用場景
在 MySQL 中,事務的開啟和提交是保證數據一致性的核心操作。以下是清晰的操作步驟和示例:
一、事務的基本操作
1. 開啟事務
有兩種方式顯式開啟事務:
- 方式 1:使用
START TRANSACTION
START TRANSACTION; -- 開始事務
- 方式 2:使用
BEGIN
BEGIN; -- 與 START TRANSACTION 等效
2. 執行事務內操作
在事務內可以執行任意 SQL 操作(DML語句):
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; -- 扣款
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- 收款
SELECT * FROM accounts; -- 查詢數據狀態(此時數據尚未持久化)
3. 提交事務
將事務內的所有操作永久生效:
COMMIT; -- 提交事務,數據寫入磁盤
4. 回滾事務
取消事務內的所有操作:
ROLLBACK; -- 回滾事務,撤銷未提交的修改
二、驗證示例(適用于 MySQL 5.7)
步驟 1:準備測試表和數據
-- 創建測試表
CREATE TABLE accounts (user_id INT PRIMARY KEY,balance DECIMAL(10,2)
) ENGINE=InnoDB; -- 必須使用 InnoDB 引擎-- 插入測試數據
INSERT INTO accounts (user_id, balance) VALUES
(1, 500.00),
(2, 0.00);
步驟 2:執行轉賬事務
-- 開啟事務
START TRANSACTION;-- 從用戶1扣款100元
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;-- 向用戶2收款100元
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;-- 提交事務(只有提交后數據才持久化)
COMMIT;
驗證結果
SELECT * FROM accounts;
-- 結果:
-- user_id=1, balance=400.00
-- user_id=2, balance=100.00
三、自動提交模式
MySQL 默認啟用自動提交(每條 SQL 單獨作為一個事務):
1. 查看當前自動提交狀態
SELECT @@autocommit; -- 返回 1 表示啟用,0 表示禁用
2. 關閉自動提交
SET autocommit = 0; -- 關閉自動提交
此時需手動執行 COMMIT
或 ROLLBACK
。
3. 重新開啟自動提交
SET autocommit = 1; -- 重新啟用自動提交
四、完整示例(含回滾)
-- 關閉自動提交
SET autocommit = 0;-- 開啟事務(可選,BEGIN 也可)
START TRANSACTION;-- 用戶1嘗試扣款200元
UPDATE accounts SET balance = balance - 200 WHERE user_id = 1;-- 發現余額不足(假設余額不能為負),主動回滾
ROLLBACK; -- 所有修改撤銷-- 重新開啟自動提交
SET autocommit = 1;
五、關鍵注意事項
- 存儲引擎:只有 InnoDB 支持事務(MyISAM 不支持)。
- 隔離級別:事務的可見性由隔離級別控制(默認 REPEATABLE READ)。
- 鎖機制:事務中的操作可能隱式或顯式加鎖(如
SELECT ... FOR UPDATE
)。 - 長事務風險:避免未及時提交的事務長時間持有鎖,導致性能問題。
六、事務的典型應用場景
- 轉賬操作:扣款和收款需原子性保證。
- 訂單創建:創建訂單與扣減庫存要一致。
- 批量數據處理:確保批量操作的完整性。
通過合理使用事務,可以確保復雜操作的數據一致性!