Ich gehe durch dieses Tutorial über PDO und bin auf den Punkt über gekommen Transaktionen. Überspringe die Verbindungsteile, habe ich diesen PHP-Code:
%Vor%Es läuft großartig und wie ich dachte, es wäre, außer wenn ich irgendwo einen Fehler einlege. Wie wenn ich einen Fehler in der vierten Insert-Anweisung erstellt hätte, würde ich drei Tiere in meiner Datenbank finden. Aber ich dachte, dass Dinge zurückgerollt werden sollten, was bedeutet, dass ich die Datenbank wie vor dem Ausführen dieses Skripts finden würde.
Habe ich etwas falsch verstanden? Was vermisse ich? Machen die Transaktions- und Rollback-Funktionen etwas anderes als das, was sie meiner Meinung nach tun sollten? Sind die Drop-and-Create-Anweisungen die Transaktion irgendwie "kaputt"? Was ist hier los?
Update: Wenn ich die Zeile $db->beginTransaction();
verschiebe, damit die Transaktion erst nach der Erstellung der Tabelle beginnt, erhalte ich das von mir erwartete Verhalten. Wenn also die dritte insert-Anweisung fehlschlägt, würde ich eine leere Tabelle haben (da sie gerade neu erstellt wurde), nachdem die Transaktion zurückgesetzt wurde. Ich frage mich immer noch, warum es nicht funktioniert, wenn die Anweisungen drop und create in der Transaktion sind ...
Überprüfen Sie das PHP-Referenzhandbuch: PDO :: beginTransaction
Einige Datenbanken, einschließlich MySQL, geben automatisch ein implizites COMMIT aus, wenn eine Anweisung der Datenbankdefinitionssprache (DDL) wie DROP TABLE oder CREATE TABLE innerhalb einer Transaktion ausgegeben wird. Das implizite COMMIT verhindert, dass Sie weitere Änderungen innerhalb der Transaktionsgrenze rückgängig machen.
Dies erklärt, warum dies passiert, und es ist eine Einschränkung von MySQL, nicht von PDO / PHP.
Tags und Links php mysql rollback transactions pdo