snippets · sql
Wer blockiert gerade meine MariaDB-Transaktion?
Ein Update hängt oder endet mit Lock wait timeout exceeded. Die langsame Query muss nicht die Query sein, die das Problem verursacht.
Erst sehen, was gerade läuft
SHOW FULL PROCESSLIST;
Achte auf lange Laufzeiten, Zustände wie Waiting ... und Sessions, die scheinbar nichts tun, aber möglicherweise noch eine offene Transaktion halten.
Dann die InnoDB-Transaktionen ansehen:
SELECT
trx_id,
trx_state,
trx_started,
trx_wait_started,
trx_mysql_thread_id,
trx_query
FROM information_schema.INNODB_TRX
ORDER BY trx_started;
Interpretation
TRX_STATE = 'LOCK WAIT' zeigt einen Wartenden. Eine sehr alte laufende Transaktion kann der Blockierer sein, selbst wenn ihre aktuelle Query leer erscheint.
Nicht sofort KILL
Eine Session abzuschießen kann Rollbacks auslösen und Anwendungsvorgänge abbrechen. Erst Zusammenhang klären: Welche Anwendung/Request gehört zur Thread-ID? Seit wann läuft die Transaktion? Ist ein vergessener COMMIT/ROLLBACK die eigentliche Ursache?
Der Denkfehler
Lock-Probleme sind Beziehungen zwischen mindestens zwei Transaktionen. Nur die wartende Query zu optimieren beantwortet deshalb oft die falsche Frage.
Quellen: https://mariadb.com/docs/server/reference/sql-statements/administrative-sql-statements/show/show-processlist https://mariadb.com/docs/server/reference/system-tables/information-schema/information-schema-tables/information-schema-innodb-tables/information-schema-innodb_trx-table