首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 事務從入門到實戰:ACID、START TRANSACTION、COMMIT/ROLLBACK、隔離級別

     編輯:MySQL 資料庫相關知識

什麼是事務?

事務是一組邏輯上不可分割的操作單元:**要麼全成功,要麼全失敗**。滿足 ACID 四大特性:

  • Atomicity(原子性):不可再分。
  • Consistency(一致性):資料從一個一致狀態變到另一個一致狀態。
  • Isolation(隔離性):併發事務互不干擾。
  • Durability(持久性):提交後永久生效。

前提條件

表必須使用 InnoDB 引擎(MyISAM 不支援事務)。


CREATE TABLE bank (name VARCHAR(20), money DECIMAL(10,2)) ENGINE=InnoDB;
INSERT INTO bank VALUES ('Alice',1000), ('Bob',5000);

基本用法


-- 1. 開啟事務
START TRANSACTION;  -- 或 BEGIN;

-- 2. 執行業務 SQL
UPDATE bank SET money = money + 500 WHERE name = 'Alice';
UPDATE bank SET money = money - 500 WHERE name = 'Bob';

-- 3. 根據結果決定
-- 全成功
COMMIT;
-- 任一失敗
ROLLBACK;

實戰演示:轉賬


-- 成功案例
START TRANSACTION;
UPDATE bank SET money = money + 500 WHERE name = 'Alice';  -- OK
UPDATE bank SET money = money - 500 WHERE name = 'Bob';    -- OK
COMMIT;
SELECT * FROM bank;  -- Alice 1500, Bob 4500

-- 失敗回滾(第二條拼寫錯誤 moey)
START TRANSACTION;
UPDATE bank SET money = money + 500 WHERE name = 'Alice';  -- OK
UPDATE bank SET moey = money - 500 WHERE name = 'Bob';     -- ERROR 1054
ROLLBACK;
SELECT * FROM bank;  -- Alice 1000, Bob 5000(回滾生效)

隔離級別與一致性讀

隔離級別髒讀不可重複讀幻讀MySQL 預設
READ UNCOMMITTED可能可能可能
READ COMMITTED不可能可能可能
REPEATABLE READ不可能不可能可能(InnoDB 用 Next-Key Lock 解決)✓
SERIALIZABLE不可能不可能不可能

-- 查看/設定隔離級別
SELECT @@transaction_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

隱式提交陷阱

以下語句會隱式提交當前事務:

  • DDL:CREATE/ALTER/DROP TABLE、TRUNCATE
  • 權限:GRANT/REVOKE
  • 鎖表:LOCK TABLES
  • 備份:FLUSH TABLES WITH READ LOCK

事務中避免混用上述語句。

保存點


START TRANSACTION;
UPDATE bank SET money = money - 100 WHERE name = 'Alice';
SAVEPOINT sp1;
UPDATE bank SET money = money - 200 WHERE name = 'Bob';
-- 發現 Bob 餘額不足
ROLLBACK TO SAVEPOINT sp1;  -- 僅回滾到 sp1
COMMIT;  -- 僅 Alice 扣款生效

最佳實踐

  1. 事務盡量短小,避免長事務持有鎖導致併發下降。
  2. 業務邏輯在應用層組裝 SQL,資料庫層只做「執行+提交/回滾」。
  3. 異常捕獲後必須 ROLLBACK,否則連接池歸還時可能隱式提交。
  4. 分佈式事務(微服務)建議用 Seata、RocketMQ 事務消息等中間件,而非資料庫原生 XA。

事務是關係型資料庫的核心價值之一,善用它守護資料正確性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved