我有一个代码:
$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(); }