萬盛學電腦網

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

MySQL 事務處理完整指南:兩種模式、InnoDB 引擎啟用、PHP 實戰範例與避坑要點

事務兩種控制模式

模式一:顯式控制(推薦)

BEGIN;                 -- 或 START TRANSACTION
-- SQL 1
-- SQL 2
COMMIT;                -- 全部成功才提交
-- 或
ROLLBACK;              -- 任一失敗全數回滾

優點:精確控制單一業務邊界,巢狀事務不支援(會隱式提交)。

模式二:自動提交開關

SET autocommit = 0;    -- 關閉自動提交,進入事務模式
-- SQL 1
-- SQL 2
COMMIT;                -- 提交並開啟新事務
SET autocommit = 1;    -- 恢復自動提交

缺點:影響整個 Session 後續所有查詢,易忘記提交導致鎖持有過久。

存儲引擎限制:必須用 InnoDB

MyISAM、MEMORY 等不支援事務。確認支援:

SHOW ENGINES;           -- 看 InnoDB 是否 YES
SHOW VARIABLES LIKE 'have_innodb';

啟用 InnoDB 步驟

  1. 修改 my.ini:註釋 skip-innodb。
  2. 重啟 MySQL 服務。
  3. 建表指定 ENGINE=InnoDB,或 ALTER TABLE t ENGINE=InnoDB。

PHP 完整事務範例

<?php
$host = 'localhost'; $user = 'root'; $pwd = 'pass'; $db = 'test';
$link = mysqli_connect($host, $user, $pwd, $db) or die('Connect failed');

mysqli_begin_transaction($link); // 或 mysqli_query($link, 'START TRANSACTION');

try {
    $sql1 = "INSERT INTO open_article (nOrder, sTopic, sContent) VALUES (0, 'Topic-1', '內容-1')";
    if (!mysqli_query($link, $sql1)) throw new Exception(mysqli_error($link));

    $sql2 = "INSERT INTO open_article (nOrder, sTopic, sContent) VALUES (0, 'Topic-2', '內容-2')";
    if (!mysqli_query($link, $sql2)) throw new Exception(mysqli_error($link));

    mysqli_commit($link);
    echo '事務提交成功';
} catch (Exception $e) {
    mysqli_rollback($link);
    echo '事務回滾: ' . $e->getMessage();
}
mysqli_close($link);
?>

驗證回滾機制

若第 2 條 SQL 失敗(如欄位名拼錯),nId 自增值會跳號(如從 1 跳到 3),證明第 1 條已執行但被回滾。

關鍵設定參數

  • innodb_flush_log_at_trx_commit = 1:最安全,每次提交刷盤。
  • innodb_lock_wait_timeout = 50:鎖等待超時秒數。
  • 隔離級別:REPEATABLE READ(預設),可依業務調整為 READ COMMITTED。
copyright © 萬盛學電腦網 all rights reserved