首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 事務處理實戰:PDO + MySQL InnoDB 完整示例

     編輯:PHP 相關知識

MySQL 事務處理核心機制與 PHP 實現

事務是一組操作的集合,遵循 ACID 原則:要麼全成功,要麼全失敗。MySQL 需使用 InnoDB 引擎(最常用)或 BDB 支援事務。

PDO 事務處理標準流程

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=psp", "root", "");
    $pdo->exec("SET NAMES utf8");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);  // 關鍵:關閉自動提交
} catch (PDOException $e) {
    die("數據庫連接失敗: " . $e->getMessage());
}

try {
    $age = 10;
    $pdo->beginTransaction();  // 開啟事務
    
    $affected1 = $pdo->exec("UPDATE kfry SET k_age = k_age + $age WHERE k_name = 'user1'");
    $affected2 = $pdo->exec("UPDATE kfry SET k_age = k_age - $age WHERE k_name = 'user2'");
    
    // 異常觸發回滾
    if (!$affected1) throw new PDOException("加款失敗");
    if (!$affected2) throw new PDOException("扣款失敗");
    
    echo "操作成功";
    $pdo->commit();  // 提交事務
} catch (PDOException $e) {
    echo "操作失敗: " . $e->getMessage();
    $pdo->rollback();  // 回滾事務
}

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);  // 恢復自動提交

關鍵點總結

  1. 關閉自動提交:ATTR_AUTOCOMMIT = 0 是事務生效前提
  2. 異常模式:ERRMODE_EXCEPTION 讓 SQL 錯誤拋出異常,便於統一捕獲
  3. 原子性保證:任何一步失敗拋出異常,catch 塊執行 rollback()
  4. 驗證結果:事務結束後查詢數據驗證是否生效

生產環境建議:對關鍵業務(轉賬、扣庫存)務必使用事務,並添加死鎖重試機制。

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