我有一個程式碼:
$tx = Yii::$app->db->beginTransaction(); try { // CODE (a lot of active-record reads and writes) $tx->commit(); echo "All good!"; } catch (\Throwable $ex) { $tx->rollback(); echo "Error"; }
它執行了,我得到“一切都好!”因此。 然而,資料庫中沒有實際儲存任何內容。 到目前為止,該程式碼已經運行了幾個月,並且沒有經過修改。 昨天突然停止工作了。
經過一個小時的調試,我可以確認操作正常,我可以「回顯」中間結果,包括我要插入的記錄的 ID。但最終提交後資料庫中仍然沒有儲存任何內容。
如果我刪除事務,程式碼就會工作,所有內容都會儲存在資料庫中,就像過去使用事務一樣。
我想確保更改的完整性,想回到事務內部。 或者,至少,我想了解哪些程式碼(或資料庫狀態或其他任何內容)阻止儲存數據,以及為什麼我沒有收到任何異常並且回顯“錯誤”,因為交易無法提交。
我確信如果事務提交失敗(實際上寫入資料庫),commit() 方法會拋出異常,但事實並非如此。有辦法獲取嗎?
提前非常感謝您。
P粉7153042392024-03-31 09:04:28
問題出在程式碼。 謝謝,@Michal Hynčica,你確實是對的。 有一個部分是這樣的:
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { continue; } ... $tx->commit(); }
透過在 continue;
之前加上 $tx->commit();
解決了這個很少發生的 if
:
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { $tx->commit(); continue; } ... $tx->commit(); }