首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP 循環執行 SQL 事務回滾:PDO 事務控制

     編輯:程式設計綜合問答

場景

循環中批量 INSERT,某次失敗需撤銷前面所有 INSERT。

解決:PDO 事務

$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $pdo->beginTransaction(); // 開啟事務
    
    foreach ($dataList as $item) {
        $stmt = $pdo->prepare("INSERT INTO t (col) VALUES (?)");
        if (!$stmt->execute([$item])) {
            throw new Exception("Insert failed"); // 觸發回滾
        }
        // 業務邏輯判斷
        if ($someCondition) {
            throw new Exception("Business rule violation");
        }
    }
    
    $pdo->commit(); // 全部成功提交
    echo "All inserted";
} catch (Exception $e) {
    $pdo->rollBack(); // 任一失敗回滾
    echo "Rolled back: " . $e->getMessage();
}

關鍵點

  • PDO::ERRMODE_EXCEPTION:讓 SQL 錯誤拋出異常,自動進入 catch 塊。
  • beginTransaction() / commit() / rollBack() 三件套。
  • **MySQL 需使用 InnoDB 引擎**,MyISAM 不支持事務。
  • 大批量 (萬級以上) 考慮 LOAD DATA INFILE 或分批提交 (每 1000 條 commit 一次),避免長事務鎖表、日志膨脹。

參考資源

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