View a markdown version of this page

Transaktions-Timeout in Amazon Aurora MySQL - Amazon Aurora

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Transaktions-Timeout in Amazon Aurora MySQL

Der aurora_transaction_timeout Parameter legt die maximale Dauer für eine Transaktion fest. Dieser Parameter kann verhindern, dass Transaktionen mit langer Laufzeit (aktiv oder inaktiv) die InnoDB-Bereinigung blockieren, was zu Leistungsproblemen führen kann. Dieser Parameter ist in Aurora MySQL Version 8.4.8 und höher verfügbar.

Einzelheiten des Parameters

Der aurora_transaction_timeout Parameter beendet jede InnoDB-Transaktion, die länger als die angegebene Dauer dauert, einschließlich schreibgeschützter Transaktionen. Sie geben den Wert in Sekunden an. Ein Wert von Null (Standardeinstellung) deaktiviert den Timeout.

In der folgenden Tabelle sind die Parameterdetails zusammengefasst.

Eigenschaft Wert
Name aurora_transaction_timeout
Scope Sitzung, global
Standard 0 (deaktiviert)
Einheit Sekunden
Dynamisch Ja, gilt nur für neue InnoDB-Transaktionen

Sie können den aurora_transaction_timeout Parameter auf Cluster-, Instanz- oder Sitzungsebene festlegen. Weitere Informationen zum Arbeiten mit Parametergruppen finden Sie unterParametergruppen für Amazon Aurora.

Timeout-Verhalten

Der aurora_transaction_timeout Parameter gilt für InnoDB-Transaktionen, die DML-Anweisungen ausführen, einschließlich schreibgeschützter Transaktionen. Alle impliziten Commit-Anweisungen außer CREATE TABLE .. AS SELECT (CTAS) und LOAD DATA sind vom Timeout ausgeschlossen. Der Timeout-Wert wird erfasst, wenn die erste InnoDB-Anweisung ausgeführt wird. Der Wert bleibt für die gesamte Lebensdauer dieser Transaktion fest.

Wenn das Timeout abläuft, hängt das Ergebnis vom Transaktionsstatus ab:

  • Wenn die Transaktion eine aktive Abfrage enthält, wird die Abfrage unterbrochen und die Transaktion wird rückgängig gemacht. Die Verbindung bleibt nutzbar.

  • Wenn keine aktive Abfrage vorhanden ist (d. h. die Transaktion ist inaktiv), wird die Verbindung beendet.

Beispiele

Die folgenden Beispiele zeigen, wann der Timer für verschiedene Transaktionsszenarien startet.

Explizite Transaktion

BEGIN; -- Does NOT start InnoDB transaction. No timer. SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE (at statement 2).

Der Timer beginnt bei Anweisung 2 (der ersten InnoDB-Anweisung).

autocommit=0

SET SESSION autocommit=0; -- No transaction yet SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE. INSERT INTO t1 ...; -- Same transaction, timer still running from step 2.

Der Timer beginnt bei Anweisung 2 (die erste InnoDB-Anweisung nach Autocommit ist deaktiviert).

Gespeicherte Prozeduren

Eine gespeicherte Prozedur wird im Transaktionskontext des Aufrufers ausgeführt. Wenn der Aufrufer bereits eine aktive InnoDB-Transaktion hat, wurde der Timer bereits vor dem Prozeduraufruf gestartet. Wenn die Prozedur als erstes InnoDB berührt, beginnt der Timer bei der ersten InnoDB-Anweisung innerhalb der Prozedur.

BEGIN; CALL my_proc(); -- If my_proc() does SELECT/INSERT, timer starts at that first InnoDB statement inside the proc

Wichtige Hinweise

  • Timeout wird beim Transaktionsstart erfasst — Der Timeout-Wert wird erfasst, wenn die erste InnoDB-Anweisung ausgeführt wird. Änderungen aurora_transaction_timeout während einer Transaktion werden bei der nächsten Transaktion wirksam, nicht bei der aktuellen. Es wird keine Warnung ausgegeben.

  • XA PREPARED-Transaktionen sind ausgeschlossen — Vorbereitete Transaktionen unterliegen nichtaurora_transaction_timeout.

  • Bei Schreibweiterleitungssitzungen kommt es nicht zu einem Transaktions-Timeout — Wenn die Schreibweiterleitung aktiviert ist, unterliegt jede Anweisung oder Transaktion, die eine weitergeleitete Anweisung enthält, diesen Bedingungen nicht. aurora_transaction_timeout Bei nachfolgenden Transaktionen in derselben Sitzung, die keine weitergeleiteten Anweisungen enthalten, kommt es wie gewohnt zu einem Timeout. Um das Leerlaufzeitlimit für weitergeleitete Transaktionen zu kontrollieren, können Sie den aurora_fwd_writer_idle_timeout Parameter verwenden. Weitere Informationen finden Sie unter Konfigurationsparameter für die Schreibweiterleitung in Aurora MySQL.

  • Seien Sie vorsichtig bei hohen Timeout-Werten — Wenn eine Transaktion mit langer Laufzeit zurückgesetzt wird, kann das Rollback um ein Vielfaches länger dauern als die ursprünglichen Datenänderungsvorgänge. Das Beenden des Datenbankprozesses hilft nicht, da das Rollback beim Serverstart neu gestartet wird. Wählen Sie einen Timeout-Wert, der Ihren Workload-Bedarf gegen die Rollback-Kosten abwägt. Weitere Informationen finden Sie in der MySQL-Dokumentation unter Optimieren des InnoDB-Transaktionsmanagements.

Fehler auf dem Client

Wenn eine Transaktion mit einer aktiven Abfrage das Timeout überschreitet, erhält der Client die folgende Fehlermeldung:

ERROR 63952 (40001): Transaction exceeded maximum allowed duration of <N> seconds and was rolled back. See aurora_transaction_timeout for configuring this behavior.

Wenn eine inaktive Transaktion den Timeout überschreitet, erhält die nachfolgende Abfrage denselben Fehler wie bei der MySQL-Fehlermeldung „Server ist weg“. Weitere Informationen finden Sie unter MySQL server has gone away in der MySQL-Dokumentation.

Fehler-log

Eine Informationsmeldung wird in das Datenbank-Fehlerprotokoll geschrieben, wenn ein Transaktions-Timeout auftritt:

[Note] Transaction breached timeout threshold and will be rolled back, if still in progress. If idle, the connection will be aborted. Check response for confirmation. connection_id: 4821, trx_id: 28193, user: app_user, timeout: 5 seconds, duration: 7 seconds
Anmerkung

Diese Protokollnachricht dient nur zu Diagnosezwecken. Verlassen Sie sich auf die Antwort des Kunden als definitiven Indikator für eine Transaktion, bei der das Zeitlimit überschritten wurde.

Überwachung von Timeouts bei Transaktionen

Verwenden Sie die Aurora_transaction_timeouts Statusvariable, um zu verfolgen, bei wie vielen Transaktionen seit dem Neustart der DB-Instance ein Timeout aufgetreten ist.

SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';

Wenn diese Option aktiviert performance_schema ist, wird der Timeout-Fehler (ER_AURORA_TRANSACTION_TIMEOUT_ERROR) auch in Tabellen performance_schema.events_errors_summary_global_by_error und verwandten Tabellen nachverfolgt. Beachten Sie, dass nur aktive Transaktions-Timeouts diesen Zähler erhöhen; inaktive Transaktions-Timeouts beenden die Verbindung, ohne dass der Fehler ausgelöst wird. ER_AURORA_TRANSACTION_TIMEOUT_ERROR

Interaktion mit anderen Timeouts

Das aurora_transaction_timeout funktioniert parallel zu den vorhandenen Timeout-Parametern. Wenn eine Transaktion länger als konfiguriert geöffnet bleibtaurora_transaction_timeout, wird sie unabhängig von anderen Timeout-Einstellungen beendet. Ob andere Timeouts die Transaktion ebenfalls rückgängig machen, hängt von ihrer eigenen Implementierung ab. Einzelheiten zu diesen Parametern finden Sie in der MySQL-Dokumentation.