PDO: Transaktionen werden nicht zurückgesetzt?

8

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 ...

    
Svish 11.03.2010, 15:41
quelle

2 Antworten

18

Ü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.

    
wimvds 11.03.2010, 16:03
quelle
2

Stellen Sie sicher, dass alle Tabellen Transaktionen unterstützen. MyISAM unterstützt zum Beispiel nicht.

    
Stig 18.08.2012 01:27
quelle

Tags und Links