So finden Sie Informationen zu nicht festgeschriebenen Transaktionen in MySQL

So finden Sie Informationen zu nicht festgeschriebenen Transaktionen in MySQL

Vor einiger Zeit habe ich einen Blogbeitrag mit dem Titel „Können wir SQL-Anweisungen von nicht festgeschriebenen Transaktionen in ORACLE finden?“ geschrieben. Können wir also in der MySQL-Datenbank die von nicht festgeschriebenen Transaktionen ausgeführten SQL-Anweisungen oder zugehörige Informationen zu nicht festgeschriebenen Transaktionen finden?

Das Experiment hat bestätigt, dass sich der Thread im Ruhezustand befindet, wenn in einer Sitzung (Verbindung) eine nicht festgeschriebene Transaktion vorliegt und kein Vorgang ausgeführt wird.

mysql> wähle connection_id() von dual;
+-----------------+
| Verbindungs-ID() |
+-----------------+
| 6 |
+-----------------+
1 Zeile im Satz (0,00 Sek.)
 
mysql> setze Sitzungs-Autocommit=0;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
 
mysql> löschen aus kkk, wo ID =1;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
 
MySQL>

Fragen Sie in einer anderen Sitzung (Verbindung) die Detailinformationen der Transaktion ab, die seit mehr als 10 Sekunden nicht mehr festgeschrieben wurde:

Wählen Sie t.trx_mysql_thread_id aus.
 ,t.trx_state
 ,t.trx_tables_in_use
 ,t.trx_tables_locked
 ,t.trx_query
 ,t.trx_rows_locked 
 ,t.trx_rows_modifiziert
 ,t.trx_lock_structs
 ,t.trx_started
 ,t.trx_isolation_level
 ,p.Zeit 
 ,p.Benutzer
 ,p.host
 ,p.db
 ,p.Befehl
VON information_schema.innodb_trx t 
 INNER JOIN information_schema.prozessliste p 
  EIN t.trx_mysql_thread_id = p.id 
WO t.trx_state = "LÄUFT" 
 UND p.Zeit > 10 
 UND p.command = 'Schlaf'\G 

Wie im obigen Screenshot gezeigt, ist trx_query ein NULL-Wert. Es ist grundsätzlich unmöglich, SQL-Anweisungen für nicht festgeschriebene Transaktionen zu finden. Die Informationen zu Transaktionen in MySQL sind nicht sehr detailliert und können sogar als etwas knapp bezeichnet werden. Ich kann nicht einmal feststellen, wo die Sperre auf diesem Tisch erfolgt. Es sind nur Informationen wie trx_row_locked, trx_row_modified und trx_started sichtbar. Dasselbe gilt, wenn Sie show engine innodb status verwenden. Sie können nur einige grundlegende Informationen sehen.

mysql> Engine-InnoDB-Status anzeigen;

---TRANSAKTION 1282583, AKTIV 11937 Sek.

2 Sperrstruktur(en), Heap-Größe 360, 8 Zeilensperre(n), Undo-Log-Einträge 1

MySQL-Thread-ID 6, OS-Thread-Handle 0x7f8da2de3700, Abfrage-ID 190 Localhost-Root

Wenn die nicht festgeschriebene Transaktion andere Sitzungen blockiert, ist es möglich (nur eine Möglichkeit, in vielen Szenarien ist es unmöglich, das SQL zu finden, das mit der festgeschriebenen Transaktion zusammenhängt), das von der nicht festgeschriebenen Transaktion ausgeführte SQL zu finden.

Wie der folgende Test zeigt, wurde der Löschvorgang in der Sitzung ausgeführt (Verbindung connection_id=11 ), die Transaktion wurde jedoch nicht festgeschrieben.

mysql> setze Sitzungs-Autocommit=0;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
 
mysql> wähle Verbindungs-ID();
+-----------------+
| Verbindungs-ID() |
+-----------------+
| 11 |
+-----------------+
1 Zeile im Satz (0,01 Sek.)
 
mysql> löschen aus kkk, wo ID=1;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
 
MySQL>

Eine andere Sitzung (Verbindung) führt einen Vorgang zum Aktualisieren eines Datensatzes aus. Zu diesem Zeitpunkt wird SQL blockiert.

mysql> wähle Verbindungs-ID();
+-----------------+
| Verbindungs-ID() |
+-----------------+
| 13 |
+-----------------+
1 Zeile im Satz (0,00 Sek.)
 
MySQL> 
mysql> aktualisiere kkk, setze ID=100, wobei ID=1;

In einer anderen Sitzung können wir das folgende SQL ausführen, um das letzte von der nicht festgeschriebenen Transaktion ausgeführte SQL zu finden.

mysql> AUSWÄHLEN r.trx_id wartende_trx_id, 
 -> r.trx_mysql_thread_id wartender_Thread, 
 -> r.trx_query warte_abfrage, 
 -> b.trx_id blockierende_trx_id, 
 -> b.trx_mysql_thread_id blockierender Thread, 
 -> b.trx_query blockierende_Abfrage 
 -> VON information_schema.innodb_lock_waits w 
 -> INNER JOIN information_schema.innodb_trx b 
 -> EIN b.trx_id = w.blocking_trx_id 
 -> INNER JOIN information_schema.innodb_trx r 
 -> EIN r.trx_id = w.requesting_trx_id; 
+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+
| Warte-TRX-ID | Warte-Thread | Warte-Abfrage | Blockierungs-TRX-ID | Blockierungs-Thread | Blockierungs-Abfrage |
+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+
| 2830 | 13 | kkk-Update, ID=100 festlegen, wobei ID=1 | 2825 | 11 | NULL |
+----------------+----------------+----------------------------------+-----------------+-----------------+----------------+
1 Zeile im Satz (0,00 Sek.)
 
mysql> SELECT a.sql_text, 
 -> c.id, 
 -> d.trx_started 
 -> VON performance_schema.events_statements_current ein 
 -> tritt performance_schema.threads b bei 
 -> EIN a.thread_id = b.thread_id 
 -> beitreten information_schema.processlist c 
 -> EIN b.processlist_id = c.id 
 -> beitreten information_schema.innodb_trx d 
 -> EIN c.id = d.trx_mysql_thread_id 
 -> wobei c.id=11
 -> ORDER BY d.trx_started\G;
*************************** 1. Reihe ***************************
 sql_text: Löschen aus kkk, wo ID = 1
  ID: 11
trx_started: 12.06.2019 23:36:13
1 Zeile im Satz (0,03 Sek.)
 
FEHLER: 
Keine Abfrage angegeben
 
MySQL> 

Zusammenfassen:

Grundsätzlich kann MySQL nur die grundlegenden Informationen zu nicht festgeschriebenen Transaktionen finden, wie etwa trx_mysql_thread_id usw. In manchen Szenarien haben wir fast keine Möglichkeit, detaillierte Informationen herauszufinden, wie etwa das von der nicht festgeschriebenen Transaktion ausgeführte SQL. Es ist unklar, welche Vorgänge für die nicht festgeschriebenen Transaktionen ausgeführt wurden.

Das ist alles für diesen Artikel. Ich hoffe, dass der Inhalt dieses Artikels für Ihr Studium oder Ihre Arbeit von gewissem Referenzwert ist. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Beispiel zum Anzeigen und Ändern der MySQL-Transaktionsisolationsebene
  • Detaillierte Erläuterung des Implementierungsprinzips von ACID-Transaktionen in MySQL
  • Erläuterung der MySQL-Transaktionsauswahl für die Aktualisierung und Datenkonsistenzverarbeitung
  • Mysql fragt die ausgeführten Transaktionen ab und wie auf Sperren gewartet werden soll
  • Beispiel für eine in Java implementierte MySQL-Transaktionsverarbeitungsoperation
  • Lösung für das Problem der gesperrten Transaktionsverarbeitung mit hoher Parallelität in PHP+MySQL
  • So starten Sie eine Transaktion in MySQL

<<:  Eine kurze Diskussion über die Magie von parseInt() in JavaScript

>>:  Detaillierte Erklärung zur Verwendung des Split-Befehls zum Teilen von Linux-Dateien

Artikel empfehlen

So fügen Sie einem Benutzer in einer Linux-Umgebung Sudo-Berechtigungen hinzu

sudo-Konfigurationsdatei Die Standardkonfiguratio...

Vue verwendet Openlayers zum Laden von Tiandi Map und Amap

Inhaltsverzeichnis 1. Weltkarte 1. Installieren S...

Wo werden MySQL-Daten gespeichert?

Speicherort der MySQL-Datenbank: 1. Wenn MySQL di...

So erhalten Sie die dynamische Anzahl der verbleibenden Wörter im Textbereich

Ich bin bei der Arbeit auf einen Fall gestoßen, ü...

MySQL-Partitionierungspraxis mit Navicat

MySQL-Partitionierung ist hilfreich bei der Verwa...

So konvertieren Sie Zeilen in Spalten in MySQL

MySQL-Zeilen-zu-Spalten-Operation Die sogenannte ...

MySQL-Abfrage gibt an, dass das Feld keine Zahl und kein Komma SQL ist

Grundlegende SQL-Anweisungen MySQL-Abfrageanweisu...

So starten Sie eine Transaktion in MySQL

Vorwort In diesem Artikel wird hauptsächlich besc...

Vue implementiert ein einfaches Einkaufswagenbeispiel

In diesem Artikel wird der spezifische Code von V...