Sollten Sie bei PHP und MySQL nach Rollback-Fehlern suchen?

10

Ich benutze die mysqli-Bibliothek von PHP. Datenbankeinfügungen und -updates befinden sich immer in einem try-catch-Block. Der Erfolg jeder Abfrage wird sofort überprüft ( if $result === false ), und jeder Fehler löst eine Ausnahme aus. Der Catch ruft mysqli_rollback() auf und wird mit einer Nachricht für den Benutzer beendet.

Meine Frage ist, sollte ich den Rückgabewert von mysqli_rollback() überprüfen? Wenn ja, und Rollback fehlschlägt, welche Aktionen sollte der Code ausführen?

Es fällt mir schwer zu verstehen, wie ein Rollback fehlschlagen könnte (abgesehen von einem schrecklichen Bug in MySQL). Und da PHP sowieso beendet wird, scheint ein Rollback fast überflüssig zu sein. Ich denke, dass es im Code für Klarheit sein sollte, aber wenn PHP beendet wird, schließt es die Verbindung zu MySQL und nicht festgeschriebene Transaktionen werden automatisch zurückgesetzt.

    
giskard22 23.08.2012, 21:45
quelle

2 Antworten

5

Wenn der Rollback fehlschlägt (z. B. Verbindungsfehler), werden die Änderungen nach dem Schließen der Verbindung zurückgesetzt, sodass Sie den Fehler nicht behandeln müssen. Wenn Sie sich in der Transaktion befinden, wird die Transaktion rückgängig gemacht, es sei denn, Sie haben eine explizite Festschreibung (oder Sie arbeiten im Autocommit-Modus, was bedeutet, dass Sie nach jeder Anweisung festgeschrieben haben).

  

Wenn eine Sitzung, für die Autocommit deaktiviert ist, ohne explizite Beendigung endet   die letzte Transaktion festschreibend, setzt MySQL diese Transaktion zurück.

Der einzige Fall, in dem Sie Rollback-Fehler behandeln möchten, ist, wenn Sie das Skript nicht verlassen, sondern eine neue Transaktion später starten, da das Starten der Transaktion implizit die aktuelle Transaktion festschreibt. Sehen Sie sich Anweisungen an, die zu einer impliziten Übergabe führen

    
Maxim Krizhanovsky 24.08.2012, 11:48
quelle
0
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ antwort12100645 ___

mysqli_rollback kann fehlschlagen, wenn Sie nicht (nie) mit der Datenbank verbunden waren. Hängt von der Fehlerbehandlung ab, die Sie vorhand haben.

    
___ qstntxt ___

Ich benutze die mysqli-Bibliothek von PHP. Datenbankeinfügungen und -updates befinden sich immer in einem try-catch-Block. Der Erfolg jeder Abfrage wird sofort überprüft ( %code% ), und jeder Fehler löst eine Ausnahme aus. Der Catch ruft %code% auf und wird mit einer Nachricht für den Benutzer beendet.

Meine Frage ist, sollte ich den Rückgabewert von %code% überprüfen? Wenn ja, und Rollback fehlschlägt, welche Aktionen sollte der Code ausführen?

Es fällt mir schwer zu verstehen, wie ein Rollback fehlschlagen könnte (abgesehen von einem schrecklichen Bug in MySQL). Und da PHP sowieso beendet wird, scheint ein Rollback fast überflüssig zu sein. Ich denke, dass es im Code für Klarheit sein sollte, aber wenn PHP beendet wird, schließt es die Verbindung zu MySQL und nicht festgeschriebene Transaktionen werden automatisch zurückgesetzt.

    
___ qstnhdr ___ Sollten Sie bei PHP und MySQL nach Rollback-Fehlern suchen? ___ answer12108859 ___

Wenn der Rollback fehlschlägt (z. B. Verbindungsfehler), werden die Änderungen nach dem Schließen der Verbindung zurückgesetzt, sodass Sie den Fehler nicht behandeln müssen. Wenn Sie sich in der Transaktion befinden, wird die Transaktion rückgängig gemacht, es sei denn, Sie haben eine explizite Festschreibung (oder Sie arbeiten im Autocommit-Modus, was bedeutet, dass Sie nach jeder Anweisung festgeschrieben haben).

  

Wenn eine Sitzung, für die Autocommit deaktiviert ist, ohne explizite Beendigung endet   die letzte Transaktion festschreibend, setzt MySQL diese Transaktion zurück.

Der einzige Fall, in dem Sie Rollback-Fehler behandeln möchten, ist, wenn Sie das Skript nicht verlassen, sondern eine neue Transaktion später starten, da das Starten der Transaktion implizit die aktuelle Transaktion festschreibt. Sehen Sie sich Anweisungen an, die zu einer impliziten Übergabe führen

    
___ tag123innodb ___ InnoDB ist eine ACID-kompatible Transaktionsspeicher-Engine für MySQL, die MultiVersion Concurrency Control (MVCC) verwendet. ___ tag123transactions ___ Eine Reihe miteinander verbundener Operationen, die alle erfolgreich sein müssen, damit einer von ihnen erfolgreich ist. Der Ausfall einer Operation führt zu einem Rollback aller Operationen in der Transaktion. ___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten. ___
EthanB 23.08.2012 22:03
quelle

Tags und Links