萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 事務處理核心指南:ACID 特性、生命週期、隔離級別與效能優化

事務是資料庫確保資料一致性的基本單位,特別在高併發、金融、訂單等核心業務中不可或缺。MySQL 透過 InnoDB 引擎提供完整的事務支援。本文系統整理事務的四大特性、控制語法、隔離級別、死鎖預防與效能調優實戰經驗。

一、什麼是事務?

事務由一組互相依賴的 SQL 語句組成,作為不可分割的邏輯工作單元:要麼全做,要麼全不做。若任一語句失敗,整個事務回滾,資料恢復到事務開始前狀態。

二、ACID 四大特性

特性英文說明
原子性Atomicity事務是最小執行單元,不可再分。
一致性Consistency事務前後資料庫保持一致狀態(如轉帳雙方金額總和不變)。
隔離性Isolation並發事務互不干擾,中間狀態對其他事務不可見。
持久性Durability提交後的修改永久保存,即使系統崩潰也能恢復。

三、事務控制語法

1. 顯式事務

START TRANSACTION;  -- 或 BEGIN / BEGIN WORK
-- SQL 語句群
COMMIT;             -- 提交
ROLLBACK;           -- 回滾

2. 自動提交控制

SET autocommit = 0;  -- 關閉自動提交
-- 後續所有語句隸屬同一事務,直到 COMMIT/ROLLBACK
SET autocommit = 1;  -- 開啟自動提交 (預設)

注意:DDL (CREATE/DROP/ALTER) 會隱式提交,無法納入事務;非事務表 (MyISAM) 操作無法回滾。

四、隔離級別與鎖機制

MySQL/InnoDB 預設 REPEATABLE READ,透過 MVCC (多版本並發控制) 實現。

隔離級別髒讀不可重複讀幻讀備註
READ UNCOMMITTED可能可能可能極少用
READ COMMITTED不可能可能可能Oracle 預設
REPEATABLE READ不可能不可能可能 (InnoDB 透過 Gap Lock 解決)MySQL 預設
SERIALIZABLE不可能不可能不可能最高隔離,效能最低

設定方式:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

五、事務效能優化策略

  1. 小事務原則:儘量縮短事務持續時間,避免長事務佔用鎖資源。
    • 用戶輸入驗證、外部 API 呼叫放在事務外完成。
    • 大批量操作拆分為多個小事務批次處理。
  2. 選擇適當隔離級別:業務允許時降級至 READ COMMITTED 可減少鎖衝突。
  3. 避免死鎖:
    • 多表操作時,固定統一的存取順序(如按表名字母序)。
    • 適當使用 SELECT ... FOR UPDATE 主動加鎖。
    • 監控 SHOW ENGINE INNODB STATUS 分析死鎖日誌。
  4. 優化提交頻率:批次操作時累積合理筆數再 COMMIT,減少 fsync 開銷。

六、實戰範例:人員刪除事務

START TRANSACTION;
DELETE FROM userinfo WHERE user_id = 1001;
DELETE FROM mail WHERE user_id = 1001;
DELETE FROM article WHERE author_id = 1001;
-- 若任一失敗
ROLLBACK;
-- 全部成功
COMMIT;

七、PHP 事務封裝範例

function executeTransaction($pdo, array $sqls) {
    $pdo->beginTransaction();
    try {
        foreach ($sqls as $sql) {
            $pdo->exec($sql);
        }
        $pdo->commit();
        return true;
    } catch (Exception $e) {
        $pdo->rollBack();
        return false;
    }
}

掌握事務精髓,配合合理的隔離級別與小事務設計,能構建高可靠、高併發的資料庫應用系統。

copyright © 萬盛學電腦網 all rights reserved