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