DB::beginTransaction()起不了作用

我們可能因為要操作兩張表以上才算完成這個流程,例如加入會員順便送他優惠券,讓他有VIP的禮遇 XD,為了確保資料的正確,在會員資料表、以及優惠券資料表,加入這兩個紀錄,我們會使用資料庫的Transaction 來完成。

try {
    DB::beginTransaction();
    // 各種資料庫操作

    // 無錯誤提交至資料庫
    DB::commit();
} catch (\Exception $exception) {
    // 發生例外,復原此次交易
    DB::rollback();
    
    // 其他發生錯誤時的商業邏輯。
}

但不管如何都沒有作用,寫入第二張資料表失敗時,第一張資料表還是會寫入資料,並沒有恢復這次資料庫交易的所有動作,可能原因有以下幾項。

症狀:

  1. 可能原因不同資料庫設定不同連線的DB,假設你的 config/database.php 有設定其他連線方式,必須加上 connection
DB::connection('otherConnection')->transaction(); DB::connection('otherConnection')->rollback(); DB::connection('otherConnection')->commit();

2. 使用MySQL資料庫留意 engine 是不是 InnoDB,MySQL有不同引擎,請確認是不是InnoDB

參考:

https://stackoverflow.com/questions/50720341/laravel-database-transactions-arent-working

發佈留言