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

PHP 使用 mysql / mysqli / PDO 三種方式處理資料庫事務

     編輯:PHP 綜合知識

核心概念

事務確保一組 SQL 操作要么全成功,要么全失敗 (原子性)。關鍵指令:`BEGIN` (開始)、`COMMIT` (提交)、`ROLLBACK` (回滾)。僅 InnoDB/BDB 引擎支援。

1. mysqli 物件導向風格 (推薦)

$mysqli = new mysqli('localhost', 'root', 'pwd', 'db');
$mysqli->autocommit(false); // 關閉自動提交

try {
    $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
    throw $e;
} finally {
    $mysqli->autocommit(true);
}

2. mysqli 程序風格

$link = mysqli_connect('localhost', 'root', 'pwd', 'db');
mysqli_autocommit($link, false);
mysqli_query($link, "UPDATE ...");
// ...
mysqli_commit($link); // 或 mysqli_rollback($link)
mysqli_autocommit($link, true);

3. 舊版 mysql 擴充套件 (已棄用,PHP 7.0+ 移除)

mysql_connect('localhost', 'root', 'pwd');
mysql_select_db('db');
mysql_query('SET AUTOCOMMIT=0');
mysql_query('BEGIN');
mysql_query("UPDATE ...");
// ...
mysql_query('COMMIT'); // 或 ROLLBACK
mysql_query('SET AUTOCOMMIT=1');
警告:`mysql_*` 函式自 PHP 5.5 棄用,7.0 移除,新專案請勿使用。

4. PDO 方式 (通用、支援多資料庫)

$pdo = new PDO('mysql:host=localhost;dbname=db', 'root', 'pwd');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->beginTransaction();
try {
    $pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    $pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

最佳實務比較

維度mysqli OOPDO
可攜性僅 MySQL支援 12+ 資料庫
預備語句支援支援 (模擬/原生)
異常處理需手動檢查回傳值原生 Exception
推薦度★★★★☆★★★★★

常見錯誤

  • 忘記關閉 `autocommit`,導致每條 SQL 獨立提交。
  • 在 `catch` 區塊未呼叫 `rollback()`。
  • 使用 MyISAM 資料表,事務不生效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved