PHP 透過 mysqli 擴展提供的方法實現 MySQL 交易控制,核心三大方法:
autocommit(bool):關閉/開啟自動提交。rollback():發生錯誤時回滾至交易起始狀態。commit():確認提交交易。<?php
// 1. 建立連線
$conn = new mysqli("localhost", "username", "password", "db_name");
$conn->query("SET NAMES utf8mb4");
// 2. 關閉自動提交,開啟交易
$conn->autocommit(false);
try {
// 3. 扣款:轉出方減少 1000
$sql1 = "UPDATE tb_money SET money = money - 1000 WHERE user = 'user_out'";
if (!$conn->query($sql1)) throw new Exception("扣款失敗");
// 4. 入款:轉入方增加 1000
$sql2 = "UPDATE tb_money SET money = money + 1000 WHERE user = 'user_in'";
if (!$conn->query($sql2)) throw new Exception("入款失敗");
// 5. 全部成功,提交交易
$conn->commit();
echo "轉帳成功";
} catch (Exception $e) {
// 6. 任何失敗,回滾
$conn->rollback();
echo "轉帳失敗:" . $e->getMessage();
} finally {
// 7. 恢復自動提交並關閉連線
$conn->autocommit(true);
$conn->close();
}
?>
autocommit(false)。try-catch 包裹業務邏輯,確保例外時自動 rollback()。commit()。autocommit(true) 還原連線預設行為,避免影響後續非交易操作。交易功能僅支援 InnoDB、NDB Cluster 等支援 ACID 的儲存引擎;MyISAM 不支援交易,執行上述程式碼將隱性提交每條語句,無法達到原子性。