首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

ADOdb 交易處理最佳實務:StartTrans/CompleteTrans 自動提交回滾、HasFailedTrans 狀態檢查

     編輯:MySQL 資料庫相關知識

為什麼需要交易?

經典轉帳案例:扣款與入帳必須同時成功或同時失敗,避免資金憑空消失/產生。

現代 API (ADOdb 4.5+)

$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()) {
    // 處理失敗邏輯:記錄、通知、補償
}

舊版 API (不推薦)

$db->BeginTrans();
$db->Execute($sql1);
$db->Execute($sql2);
if ($error) $db->RollbackTrans(); else $db->CommitTrans();

缺點:需手動檢查每步錯誤,易漏寫導致資料不一致。

進階控制

  • FailTrans():強制標記交易為失敗,稍後 CompleteTrans 會 ROLLBACK
  • 巢狀交易:StartTrans 可巢狀,只有最外層 CompleteTrans 真正提交

前置條件:儲存引擎必須支援交易

引擎交易支援
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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved