Ich habe einige Abfragen ohne Commit durchgeführt. Dann wurde die Anwendung gestoppt.
Wie kann ich diese offenen Transaktionen anzeigen und festschreiben oder abbrechen?
Ich habe einige Abfragen ohne Commit durchgeführt. Dann wurde die Anwendung gestoppt.
Wie kann ich diese offenen Transaktionen anzeigen und festschreiben oder abbrechen?
Antworten:
Wie kann ich diese offenen Transaktionen anzeigen und festschreiben oder abbrechen?
Es gibt keine offene Transaktion. MySQL setzt die Transaktion beim Trennen der Verbindung zurück.
Sie können die Transaktion (IFAIK) nicht festschreiben.
Sie zeigen Threads mit an
SHOW FULL PROCESSLIST
Siehe: http://dev.mysql.com/doc/refman/5.1/en/thread-information.html
Dies hilft Ihnen nicht, da Sie keine Transaktion über eine unterbrochene Verbindung festschreiben können.
Was passiert, wenn eine Verbindung unterbrochen wird?
Aus den MySQL-Dokumenten: http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html
4.5.1.6.3. Deaktivieren von MySQL Auto-Reconnect
Wenn der MySQL-Client beim Senden einer Anweisung seine Verbindung zum Server verliert, versucht er sofort und automatisch, erneut eine Verbindung zum Server herzustellen und die Anweisung erneut zu senden. Allerdings , auch wenn mysql in der Wiederverbindung mit dem ersten Verbindung erfolgreich beendet ist und alle Ihre vorherige Sitzung Objekte und Einstellungen verloren gehen : temporäre Tabellen, die Autocommitmodus und benutzerdefiniert und Session - Variablen. Außerdem wird jede aktuelle Transaktion zurückgesetzt .
Dieses Verhalten kann für Sie gefährlich sein, wie im folgenden Beispiel, in dem der Server zwischen der ersten und der zweiten Anweisung heruntergefahren und neu gestartet wurde, ohne dass Sie es wissen:
Siehe auch: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
So diagnostizieren und beheben Sie dies
So überprüfen Sie die automatische Wiederverbindung:
Wenn eine automatische Wiederverbindung auftritt (z. B. durch Aufrufen von mysql_ping ()), gibt es keinen expliziten Hinweis darauf. Um nach einer erneuten Verbindung zu suchen, rufen Sie
mysql_thread_id()an, um die ursprüngliche Verbindungskennung zu erhalten, bevor Sie anrufenmysql_ping(), und rufen Sie dannmysql_thread_id()erneut an, um festzustellen, ob sich die Kennung geändert hat.
Stellen Sie sicher, dass Sie Ihre letzte Abfrage (Transaktion) im Client behalten, damit Sie sie bei Bedarf erneut senden können.
Deaktivieren Sie den automatischen Wiederverbindungsmodus, da dies gefährlich ist. Implementieren Sie stattdessen Ihre eigene Wiederverbindung, damit Sie wissen, wann ein Verbindungsabbruch auftritt, und diese Abfrage erneut senden können.
mysqld.dllAKA, den Client. Und Sie behalten die SQL-Anweisung , die die vollständige Transaktion enthält, im Speicher, damit Sie sie wiedergeben können, wenn die Verbindung unterbrochen wird. Oder Sie speichern es lokal auf der Festplatte, damit Sie es beim Neustart erneut senden können.
Obwohl in diesem Fall keine Transaktion übrig bleibt, wie @Johan sagte, können Sie die aktuelle Transaktionsliste in InnoDB mit der folgenden Abfrage anzeigen, wenn Sie möchten.
SELECT * FROM information_schema.innodb_trx\G
Aus dem Dokument :
Die Tabelle INNODB_TRX enthält Informationen zu jeder Transaktion (ausgenommen schreibgeschützte Transaktionen), die derzeit in InnoDB ausgeführt wird, einschließlich der Frage, ob die Transaktion beim Start der Transaktion auf eine Sperre wartet, und der SQL-Anweisung, die die Transaktion ausführt, falls vorhanden.
\GModifikator am Ende nur nützlich ist, wenn Sie die Abfrageausgabe im MySQL-CLI-Tool formatieren möchten. Wenn Sie ein GUI-Tool wie MySQL Workbench verwenden, benötigen Sie es nicht.
Sie können show innodb status(oder show engine innodb statusfür neuere Versionen von MySQL) verwenden, um eine Liste aller derzeit in der InnoDB-Engine anstehenden Aktionen abzurufen. In der Wand der Ausgabe sind die Transaktionen und die interne Prozess-ID vergraben, unter der sie ausgeführt werden.
Sie können ein Commit oder Rollback dieser Transaktionen nicht erzwingen, aber Sie KÖNNEN den MySQL-Prozess beenden, der sie ausführt, was im Wesentlichen auf ein Rollback hinausläuft. Es unterbricht die Verbindung der Prozesse und bewirkt, dass MySQL das verbleibende Chaos beseitigt.
Folgendes möchten Sie suchen:
------------
TRANSACTIONS
------------
Trx id counter 0 140151
Purge done for trx's n:o < 0 134992 undo n:o < 0 0
History list length 10
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 17004, OS thread id 140621902116624
MySQL thread id 10594, query id 10269885 localhost marc
show innodb status
In diesem Fall besteht derzeit nur eine Verbindung zur InnoDB-Engine (mein Login, Ausführen der showAbfrage). Wenn diese Zeile eine tatsächliche Verbindung / feststeckende Transaktion wäre, die Sie beenden möchten, würden Sie eine kill 10594.
show engine innodb status?
Alles auflisten:
SHOW FULL PROCESSLIST
Wenn Sie eine Hang-Transaktion beenden möchten, kopieren Sie die Transaktions-ID und beenden Sie die Transaktion mit diesem Befehl:
KILL <id> // e.g KILL 16543