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

CSS-Code zum Erstellen von 10 modernen Layouts

Vorwort Ich habe mir am Sonntag zu Hause das drei...

Lösen Sie das Problem, dass die mit nginx erhaltene IP-Adresse 127.0.0.1 ist

Holen Sie sich das IP-Tool importiere lombok.exte...

Zusammenfassung des Wissens zu MySQL-Sperren

Sperren in MySQL Sperren sind ein Mittel, um Ress...

So verwenden Sie crontab zum Hinzufügen geplanter Aufgaben in Linux

Vorwort Das Linux-System wird durch den Systemdie...

Tutorial zur Installation von MySQL 5.7.18 auf Mac OS 10.12

Ich habe das ganze Internet durchsucht und bin au...

Die Eisernen Gesetze der MySQL-Datenbank (Zusammenfassung)

Gute Datenbankspezifikationen tragen dazu bei, di...

Implementierung einer Bildfragmentierungsladefunktion basierend auf HTML-Code

Heute werden wir einen fragmentierten Bildladeeff...

Docker stellt Mysql, .Net6, Sqlserver und andere Container bereit

Inhaltsverzeichnis Installieren Sie Docker unter ...

So erstellen Sie einen MySQL-Cluster mit hoher Verfügbarkeit und Leistung

Inhaltsverzeichnis Was ist MySQL NDB Cluster? Vor...