首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

PHP PDO 事務處理實戰與 MySQL InnoDB 引擎啟用指南

     編輯:MySQL 綜合教學

PHP PDO 事務處理實戰與 MySQL InnoDB 引擎啟用指南

事務是數據一致性的基石。本文涵蓋 MySQL InnoDB 引擎啟用驗證、PHP PDO 事務完整代碼模板、異常回滾模式、自動提交控制,幫助 PHPer 快速落地可靠的寫入邏輯。

一、確保 InnoDB 引擎可用

  1. my.cnf 取消註釋 #skip-innodb → skip-innodb(若存在),重啟。
  2. 或添加 default-storage-engine=InnoDB,重啟。
  3. 驗證:SHOW ENGINES; 確認 InnoDB Support = YES/DEFAULT。

SHOW ENGINES 結果

二、PDO 事務代碼模板(生產級)

<?php
try {
    // 1. 建立連接
    $pdo = new PDO("mysql:host=xxxx;dbname=xxxx;charset=utf8mb4", "xxxx", "xxxx");
    // 2. 異常模式:SQL 錯誤拋出 PDOException
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 3. 關鍵:關閉自動提交,開啟事務邊界
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
} catch (PDOException $e) {
    die("DB連接失敗: " . $e->getMessage());
}

try {
    // 4. 顯式開啟事務
    $pdo->beginTransaction();

    $price = 500;
    // 5. 業務 SQL
    $sql1 = "UPDATE zhanghao SET price = price - {$price} WHERE id = 1";
    $affected1 = $pdo->exec($sql1);
    if ($affected1 === 0) throw new Exception("扣款失敗:id=1 不存在或餘額不足");

    $sql2 = "UPDATE zhanghao SET price = price + {$price} WHERE id = 2";
    $affected2 = $pdo->exec($sql2);
    if ($affected2 === 0) throw new Exception("入賬失敗:id=2 不存在");

    // 6. 提交事務
    $pdo->commit();
    echo "交易成功";

} catch (Exception $e) {
    // 7. 任意異常 → 回滾
    $pdo->rollBack();
    echo "交易失敗並回滾: " . $e->getMessage();
}
?>

三、關鍵屬性與方法速查

屬性/方法作用注意事項
ATTR_ERRMODE => ERRMODE_EXCEPTIONSQL 錯誤拋出異常,避免靜默失敗必開,否則需手動檢查 errorCode/errorInfo
ATTR_AUTOCOMMIT => 0關閉自動提交,手動控制事務邊界與 beginTransaction() 配套使用
beginTransaction()啟動事務(發送 START TRANSACTION)巢狀事務不支持,會拋異常
commit()提交事務成功才持久化
rollBack()回滾事務捕獲異常後必須調用
exec()執行 DML,返回影響行數不返回結果集
lastInsertId()獲取上條 INSERT 自增 ID需在同一連接、事務提交前調用

四、常見坑點與避坑指南

  1. MyISAM 不支持事務:表必須是 InnoDB,SHOW TABLE STATUS LIKE 't%'; 驗證 Engine=InnoDB。
  2. DDL 隱式提交:事務中執行 CREATE/DROP/ALTER/TRUNCATE 會隱式提交前面操作,打破原子性。
  3. 長事務危害:持有鎖時間長 → 阻塞併發、Undo 積壓 → Buffer Pool 壓力、主從延遲。業務邏輯儘量精簡,避免事務中調用外部 RPC/HTTP。
  4. 死鎖處理:捕獲 SQLSTATE[HY000]: General error: 1213 Deadlock found,指數退避重試 3 次。
  5. 異常捕獲層級:捕獲 Exception 而非 PDOException,覆蓋業務邏輯拋出的自定義異常。

事務不僅是 BEGIN/COMMIT,更是對數據一致性承諾的代碼體現。嚴格遵循「異常即回滾、業務驗證前置、長事務拆分」三原則,線上零事故。

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