經典轉帳案例:扣款與入帳必須同時成功或同時失敗,避免資金憑空消失/產生。
$sql1 = "UPDATE employees SET balance=balance-10 WHERE id=15";
$sql2 = "UPDATE employees SET balance=balance+10 WHERE id=22";
$db->StartTrans(); // 開始交易,自動偵測錯誤
$db->Execute($sql1);
$db->Execute($sql2);
$db->CompleteTrans(); // 自動 COMMIT 或 ROLLBACK
// 檢查結果
if ($db->HasFailedTrans()) {
// 處理失敗邏輯:記錄、通知、補償
}
$db->BeginTrans();
$db->Execute($sql1);
$db->Execute($sql2);
if ($error) $db->RollbackTrans(); else $db->CommitTrans();
缺點:需手動檢查每步錯誤,易漏寫導致資料不一致。
FailTrans():強制標記交易為失敗,稍後 CompleteTrans 會 ROLLBACK| 引擎 | 交易支援 |
|---|---|
| InnoDB | ✅ 完整 ACID |
| BDB | ✅ |
| MyISAM | ❌ 不支援 (StartTrans 會失效) |
| Memory/Heap | ❌ |
$db->StartTrans();
try {
$db->Execute("INSERT INTO orders ... ");
$db->Execute("UPDATE inventory SET qty=qty-1 WHERE sku='A1' ");
$db->CompleteTrans();
} catch (Exception $e) {
$db->FailTrans();
$db->CompleteTrans();
throw $e;
}