Die Yii2 Mariadb-Transaktion wurde erfolgreich übermittelt, es werden jedoch keine Daten in der Datenbank gespeichert.
P粉386318086
P粉386318086 2024-03-30 23:03:30
0
1
473

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.

P粉386318086
P粉386318086

Antworte allen(1)
P粉715304239

问题出在代码上。 谢谢,@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();
}
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage