Ich habe einen Code:
$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"; }
Es wurde ausgeführt und ich bekam ?Alles ist in Ordnung!“ Allerdings wird tats?chlich nichts in der Datenbank gespeichert. Der Code l?uft nun seit mehreren Monaten ohne ?nderung. Gestern hat es pl?tzlich nicht mehr funktioniert.
Nach einer Stunde Debugging kann ich best?tigen, dass der Vorgang ordnungsgem?? funktioniert, und ich kann die Zwischenergebnisse ?echoisieren“, einschlie?lich der ID des Datensatzes, den ich einfügen m?chte. Nach der endgültigen übermittlung wird jedoch nichts mehr in der Datenbank gespeichert.
Wenn ich die Transaktion entferne, funktioniert der Code und alles wird in der Datenbank gespeichert, genau wie früher bei Transaktionen.
Ich m?chte die Integrit?t der ?nderungen sicherstellen und wieder in die Transaktion einsteigen. Oder zumindest m?chte ich verstehen, welcher Code (oder Datenbankstatus oder was auch immer) die Speicherung der Daten verhindert und warum ich keine Ausnahmen erhalte und ?Fehler“ zurückgebe, weil die Transaktion nicht festgeschrieben werden konnte.
Ich war mir sicher, dass die Methode commit() eine Ausnahme ausl?sen würde, wenn das Festschreiben der Transaktion fehlschl?gt (eigentlich das Schreiben in die Datenbank), aber das ist nicht der Fall. Gibt es eine M?glichkeit, es zu bekommen?
Vielen Dank im Voraus.
問題出在代碼上。 謝謝,@Michal Hyn?ica,你確實(shí)是對(duì)的。 有一個(gè)部分是這樣的:
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { continue; } ... $tx->commit(); }
通過在 continue;
之前添加 $tx->commit();
解決了這個(gè)很少發(fā)生的 if
:
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { $tx->commit(); continue; } ... $tx->commit(); }