한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Game-Lag-Whitepaper › L12 Datenbank

Lange offene Transaktion Long-running transaction / MVCC purge lag

Ursachen-ID db-long-tx · Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt DB-Infrastruktur (Infrastrukturteam)

In der interaktiven Fassung mit Grafiken und Experimenten öffnen →

Bleibt eine Transaktion lange offen, hält sie ihre Locks weiter, und die DB kann alte Datenversionen nicht bereinigen (Purge). Dadurch wird alles nach und nach langsamer.

Warum Bei offener Transaktion wird auf die Antwort eines anderen Servers gewartet, oder im laufenden Betrieb läuft eine lange Aggregations-Query auf der Primär-DB → Folge Gehaltene Locks werden nicht freigegeben, alte Datenversionen, die bereinigt werden müssten, stauen sich → Auf dem Bildschirm Timeouts bei Funktionen, die diese Zeile nutzen, Speichern und Abfragen werden über Stunden insgesamt langsamer

Symptome
Input-Lag, Verschluckte Aktion / Rollback
Faktoren
Latenz, Stillstand
Wer ist betroffen
Nur eine bestimmte Funktion, Ganzer Server
Wann
Je länger es läuft, Gelegentlich, zufällig
Zuständigkeit
Hauptzuständig Server-Entwicklung (Entwicklungsteam) · Beteiligt DB-Infrastruktur (Infrastrukturteam)
Aufgaben Entwicklungsteam
Innerhalb einer Transaktion nicht auf Netzwerkaufrufe oder Benutzereingaben warten, Aggregations-Queries auf dem Replikat ausführen.
Aufgaben Infrastrukturteam
Alarm auf lange offene Transaktionen einrichten und sie zwangsweise beenden, Replikat für Aggregationen bereitstellen, Wachstum von Undo-Log und toten Zeilen überwachen.
Im Graphen
Langsamer Anstieg · Länge des Undo-Logs (History list length), tote Zeilen
Wo nachsehen
MySQL: mit trx_started in INFORMATION_SCHEMA.INNODB_TRX die älteste Transaktion finden und History list length (noch nicht bereinigte Undo-Log-Menge) im Abschnitt TRANSACTIONS von SHOW ENGINE INNODB STATUS prüfen. PostgreSQL: xact_start und Sessions mit state idle in transaction in pg_stat_activity sowie n_dead_tup in pg_stat_user_tables prüfen
Spricht dafür
Eine Transaktion läuft seit Minuten bis Stunden, währenddessen steigen History list length oder n_dead_tup stetig und sinken erst, wenn nach dem Beenden dieser Transaktion die Bereinigung (Purge, VACUUM) läuft
Spricht dagegen
Keine alten Transaktionen, trotzdem insgesamt langsam: Checkpoint (db-checkpoint) oder Datenträger
Prüfmittel
Mit Infrastruktur-Tools prüfbar (ohne Spielcode)
Mehr dazu
Damit Lesende den Stand vor einer Änderung sehen können, hält die DB alte Versionen vor (MVCC). Diese Einträge lassen sich erst löschen, wenn die älteste Transaktion beendet ist. Bleibt eine Transaktion mehrere Stunden offen, wächst bei MySQL das Undo-Log, und bei PostgreSQL häufen sich tote Zeilen (Dead Tuples), die VACUUM nicht bereinigen kann. Bei SQL Server schrumpft das Transaktionslog nicht und kann sogar den Datenträger füllen.

Quellen

  1. InnoDB Multi-Versioning MySQL
    Solange eine Transaktion alte Versionen sehen kann, lässt sich das Update-Undo-Log nicht verwerfen und das Rollback-Segment wächst; empfohlen wird, auch reine Lesetransaktionen häufig zu committen
  2. Routine Vacuuming (PostgreSQL Documentation) PostgreSQL
    Alte Zeilenversionen lassen sich nicht löschen, solange andere Transaktionen sie sehen können; lange offene Transaktionen müssen beendet oder ihre Sessions getrennt werden
  3. Client Connection Defaults (PostgreSQL Documentation) PostgreSQL
    idle_in_transaction_session_timeout: trennt Sessions, die mit offener Transaktion untätig sind, damit sie Locks nicht lange halten
  4. Troubleshoot a full transaction log (SQL Server Error 9002) Microsoft SQL Server
    Lange laufende aktive Transaktionen verhindern die Bereinigung des Transaktionslogs
  5. The INFORMATION_SCHEMA INNODB_TRX Table MySQL
    TRX_STARTED: Startzeitpunkt der Transaktion
  6. Purge Configuration MySQL
    Purge bereinigt die Liste der Undo-Logs committeter Transaktionen (History List), der Rückstand steht als History list length im Abschnitt TRANSACTIONS von SHOW ENGINE INNODB STATUS
  7. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    xact_start (Startzeitpunkt der Transaktion) und state (idle in transaction) in pg_stat_activity, n_dead_tup (geschätzte Zahl toter Zeilen) in pg_stat_user_tables

Verwandte Ursachen

Gleiche Schicht: L12 Datenbank

Ursachen aus anderen Schichten mit demselben Symptom (Input-Lag)

Karte in der interaktiven Fassung mit Grafiken und Experimenten ansehen