Aktueller Standort: Startseite> Neueste Artikel> Warum fällt die Transaktion aus, kehrt jedoch bei 0 zurück, wenn Sie MySQLI :: $ errno verwenden? Welche anderen Funktionen müssen Sie kombinieren, um das Problem zu diagnostizieren?

Warum fällt die Transaktion aus, kehrt jedoch bei 0 zurück, wenn Sie MySQLI :: $ errno verwenden? Welche anderen Funktionen müssen Sie kombinieren, um das Problem zu diagnostizieren?

M66 2025-06-23

In PHP -Datenbankoperationen ist die MySQLI -Erweiterung die am häufigsten verwendete Methode zum Verbinden und Betrieb von MySQL -Datenbanken. In vielen Szenarien verwenden wir Transaktionen, um die Atomizität von Datenbankoperationen sicherzustellen. Bei Verwendung von MySQLI :: $ errno für die Fehlerdiagnose können Sie jedoch eine verwirrende Situation begegnen: Auch wenn die Transaktion fehlschlägt, gibt MySQLI :: $ errno 0 zurück, was es uns schwer macht, das Problem zu diagnostizieren.

Transaktions- und Fehlercodes

Zunächst müssen wir verstehen, wie MySQLI :: $ Errno funktioniert. MySQLI :: $ errno gibt den Fehlercode für den letzten Datenbankvorgang zurück. Wenn die Operation erfolgreich ist, beträgt sein Wert 0; Wenn die Operation fehlschlägt, wird ein Fehlercode ungleich Null zurückgegeben. Das Problem ist jedoch, dass einige Datenbankvorgänge (insbesondere diejenigen, die Transaktionen betreffen) nicht immer direkt von MySQLI :: $ errno aktualisieren, und selbst wenn der Vorgang fehlschlägt, erzeugt es möglicherweise keinen signifikanten Fehlercode.

Transaktion fiel, kehrte aber 0 zurück

Wenn Sie auf Probleme stoßen und mit Transaktionen auftreten und feststellen, dass selbst wenn die Transaktion fehlschlägt, ist MySQLI :: $ errno immer noch 0, was nicht bedeutet, dass keine Fehler aufgetreten sind. Tatsächlich kann die Transaktionsoperation selbst keinen Fehlercode direkt senden. Wenn beispielsweise MySQLi :: begin_transaction () oder mySQLi :: commit () verwendet wird, gibt es möglicherweise keinen Fehlercode zurück, wenn die Datenbank selbst keinen schwerwiegenden Fehler erkennt, sondern einfach die Transaktion als "fehlgeschlagen" markieren.

Dieses Phänomen tritt normalerweise in den folgenden Situationen auf:

  1. Auto Commit -Modus: Wenn MySQLI :: $ auto_commit in der Transaktion auf TRUE eingestellt ist, kann der Transaktionsvorgang automatisch festgelegt werden und es gibt auch bei einem Fehler keinen expliziten Rollback.

  2. SQL -Fehler werden nicht angezeigt: Einige Fehler (z. B. Datenbeschränkungsfehler) werden möglicherweise nicht sofort in MySQLi :: $ errno reflektiert, insbesondere wenn Datenbankfehler unterdrückt werden.

Probleme mit anderen Funktionen diagnostizieren

Wenn MySQLI :: $ errno 0 zurückgibt und Sie vermuten, dass der Transaktionsvorgang fehlschlägt, können Sie die folgenden Funktionen kombinieren, um das Problem zu diagnostizieren:

  1. MySQLI :: $ ERROR :
    MySQLI :: $ ERROR gibt eine Fehlermeldung für die Datenbankoperation zurück. Wenn MySQLI :: $ errno 0 ist, kann Ihnen die Überprüfung von MySQLI :: $ ERROR helfen, detailliertere Fehlerinformationen zu erhalten. Auch ohne explizite Fehlercode kann die Datenbankfehlermeldung als Zeichenfolge bestehen.

     if ($mysqli->errno) {
        echo "Error: " . $mysqli->error;
    }
    
  2. MySQLI :: ERROR_LIST :
    Für MySQL Version 5.5+ enthält MySQLI :: ERROR_LIST eine Fehlerliste, mit der Sie detailliertere Fehlerinformationen erhalten können, einschließlich mehrerer Fehler, was besonders nützlich ist, wenn Transaktionen komplex sind.

     $errors = $mysqli->error_list;
    foreach ($errors as $error) {
        echo "Error code: " . $error['errno'] . " - " . $error['error'];
    }
    
  3. Mysqli :: Rollback () :
    Wenn Sie auf ein Problem des Transaktionsfehlers stoßen, können Sie Rollback () explizit aufrufen, wenn die Transaktion fehlschlägt und die Transaktion zusammen mit Fehlerinformationen zurückrollt, um das Problem zu analysieren. Dies kann Datenkonsistenzen vermeiden, die durch unvollständige Transaktions -Commits verursacht werden.

     $mysqli->rollback();
    echo "Transaction failed, rolled back.";
    
  4. Motor InnoDB Status :
    Dies ist ein integrierter Befehl in MySQL, um die Statusinformationen der InnoDB-Engine zu erhalten. Wenn Sie diesen Befehl abfragen, können Sie detaillierte Informationen zur Transaktion, einschließlich Deadlock, Sperrenwartung und anderen Problemen, anzeigen. Sie können diesen Befehl über MySQLI :: Query () ausführen, um mehr Hinweise zu erhalten.

     $result = $mysqli->query("SHOW ENGINE INNODB STATUS");
    $status = $result->fetch_assoc();
    echo $status['Status'];
    
  5. Zeigen Sie das Datenbankprotokoll an:
    In einigen Fällen kann das Fehlerprotokoll der Datenbank nützlichere Informationen liefern, insbesondere wenn einige zugrunde liegende Transaktionsfehler nicht über den von PHP zurückgegebenen Fehlercode erhalten werden können. Sie können MySQL -Fehlerprotokolldateien überprüfen oder ein Tool wie PhpMyAdmin verwenden, um diese Protokolle anzuzeigen.

Zusammenfassen

Bei der Verwendung von MySQLI :: $ errno können wir jedoch auf eine Vielzahl von Gründen, einschließlich des automatischen Komitiemodus, des SQL -Fehlerfehlers usw. zurückgeführt, um Transaktionsfehlerprobleme genauer zu diagnostizieren, können wir andere Funktionen kombinieren, und Methoden wie MySQLI :: $ -Fehler , MySQLI :: ERROR_LIST , Zeigen Sie den Status des Motors. Achten Sie darauf, dass Sie die Transaktionsstart-, Commit- und Rollback -Operationen mit Vorsicht bearbeiten, um die Datenkonsistenz zu gewährleisten.