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
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
InnoDB Multi-VersioningMySQL 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
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
Purge ConfigurationMySQL 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