事務確保一組 SQL 操作要么全成功,要么全失敗 (原子性)。關鍵指令:`BEGIN` (開始)、`COMMIT` (提交)、`ROLLBACK` (回滾)。僅 InnoDB/BDB 引擎支援。
$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);
}
$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);
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 移除,新專案請勿使用。
$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 OO | PDO |
|---|---|---|
| 可攜性 | 僅 MySQL | 支援 12+ 資料庫 |
| 預備語句 | 支援 | 支援 (模擬/原生) |
| 異常處理 | 需手動檢查回傳值 | 原生 Exception |
| 推薦度 | ★★★★☆ | ★★★★★ |