Bevor Sie mit Beginn_transaction () aufrufen, müssen Sie sicherstellen, dass die Datenbankverbindung erfolgreich hergestellt wurde. Wenn die Verbindung fehlschlägt, macht das Aufrufen der transaktionsbezogenen Methode einen Fehler. Zum Beispiel:
<Code> $ mysqli = new MySQLI ('localhost', 'user', 'passway', 'database'); if ($ mysqli-> connect_error) {
Die ('Verbindung fehlgeschlagen:'. $ mysqli-> connect_error);
}
$ mysqli-> begin_transaction (); // Wenn die Verbindung fehlschlägt, meldet diese Zeile einen Fehler
</code>
Es wird empfohlen, die Verbindungserkennungslogik hinzuzufügen, bevor die Transaktionsmethode aufgerufen wird und Fehlerinformationen für die anschließende Fehlerbehebung ordnungsgemäß aufgezeichnet werden.
Stellen Sie sicher, dass der Datenbankbenutzer über die Berechtigung verfügt, Transaktionen zu aktivieren. Einige gemeinsam genutzte Hosts oder Datenbankkonten mit begrenzten Berechtigungen können durch die Durchführung von Transaktionen eingeschränkt werden.
<code> // Beispiel: Abfragen Sie die aktuellen Benutzerberechtigungen $ result = $ mySQLI-> Abfrage ("Zuschüsse für current_user ()"); while ($ row = $ result-> fetch_row ()) {echo $ row [0]. "\N"; } </code>Wenn Sie feststellen, dass die Starttransaktion oder alle Berechtigungen nicht in den Zuschussberechtigungen enthalten sind, bedeutet dies, dass die Leistungsberechtigungen begrenzt sind und Sie den Datenbankadministrator kontaktieren müssen, um die Berechtigungen anzupassen.
Transaktionen werden in MySQL -Tabellen mit der InnoDB -Engine unterstützt. Wenn Sie versuchen, eine Transaktion in der MyISAM -Tabelle zu aktivieren, wird dies nicht wirksam und ein Fehler kann auftreten.
<Code> // Tabelle Engine $ result = $ mySQLi-> Abfrage ("Tabelle Status anzeigen, wobei Name = 'your_table'"); $ row = $ result-> fetch_assoc (); Echo 'Motortyp:'. $ row ['motor']; </code>Wenn der Ausgang MyISAM ist, müssen Sie die Tabellenstruktur ändern und seinen Motor in InnoDB ändern:
<Code> TABLE ALTER TABLE your_table Engine = InnoDB; </code>Eine der Funktionen von MySQLi :: begin_transaction () ist die Ausschaltung der Automatikübermittlung. Wenn die aktuelle Verbindung bereits auf den automatischen Beförderungsmodus eingestellt ist, können einige Datenbankkonfigurationen möglicherweise nicht überschreiben, was dieses Verhalten überschreibt, was dazu führt, dass die Transaktion nicht ordnungsgemäß geöffnet wird.
<Code> // explizit automatisch $ mysqli-> autocommit (false); // eine Transaktion starten
$ mysqli-> begin_transaction ();
</code>
Einige ältere Versionen von MySQL -Servern (z. B. 5.5 oder unten) können den Aufruf an AutoCommit (False) unter bestimmten Konfigurationen ignorieren, und die Einstellungen relevanter Parameter (z. B. AutoCommit ) in der Datenbankversion und Konfigurationsdateien sollten bestätigt werden.
Verwenden Sie Try ... Catch und MySQLi_SQL_Exception -Klassen, um Fehlermeldungen besser zu erfassen und zu diagnostizieren.
<Code> mysqli_report (mysqli_report_error | mysqli_report_strict); versuchen {
$ mysqli = new Mysqli ('localhost', 'user', 'password', 'database');
$ mysqli-> begin_transaction ();
// Transaktionsbetrieb
$ mysqli-> commit ();
} catch (mysqli_sql_exception $ e) {
Echo 'Transaktionsfehler:'. $ e-> getMessage ();
$ mysqli-> rollback ();
}
</code>
Diese Methode kann Entwicklern helfen, Fehler schnell zu finden, z. B. Zeitüberschreitungen, Netzwerkfehler oder SQL -Konfigurationsprobleme.
Wenn die Verbindungsfehlermeldung während der Abfrage keine Verbindung zu MySQL Server oder verlorene Verbindung herstellt, wird empfohlen, die folgende Netzwerkkonfiguration zu überprüfen:
Ist der Hostname korrekt (z. B. die Verwendung von Localhost gegenüber 127.0.0.1 );
Ob die Firewall die Kommunikation von Port 3306 erlaubt;
Ob der Datenbankserver ausgeführt wird;
Ob es eine Verbindungsgrenze gibt (z. B. max_connections -Einstellung ist zu niedrig);
Testen einer Verbindung mit Tools wie Ping- , Telnet- oder Datenbankclients (z. B. DBeaver, MySQL Workbench) können schnell die Probleme bestätigen:
<code> telnet gitbox.net 3306 </code>Wenn die obigen Methoden das Problem nicht finden können, können Sie das MySQL -Fehlerprotokoll und das PHP -Fehlerprotokoll anzeigen:
MySQL -Protokollpfad (normalerweise in /var/log/mysql/error.log oder in der Konfigurationsdatei angegeben);
PHP -Fehlerprotokollpfad (kann über die ERROR_LOG -Konfiguration von php.ini angezeigt werden);
Durch die Suche nach Schlüsselwörtern wie Fehler 2002 , Fehler 1045 , Fehler 2013 im Protokoll kann das Problem schnell sperren.