View a markdown version of this page

Timeout della transazione in Amazon Aurora MySQL - Amazon Aurora

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Timeout della transazione in Amazon Aurora MySQL

aurora_transaction_timeoutIl parametro imposta la durata massima di una transazione. Questo parametro può aiutare a evitare che transazioni di lunga durata (attive o inattive) blocchino l'eliminazione di InnoDB, il che può portare a problemi di prestazioni. Questo parametro è disponibile in Aurora MySQL versione 8.4.8 e successive.

Dettagli dei parametri

Il aurora_transaction_timeout parametro termina qualsiasi transazione InnoDB che dura più della durata specificata, incluse le transazioni di sola lettura. Specifichi il valore in secondi. Un valore pari a zero (impostazione predefinita) disabilita il timeout.

La tabella seguente riassume i dettagli dei parametri.

Proprietà Valore
Nome aurora_transaction_timeout
Scope Sessione, globale
Predefinita 0 (disabilitato)
Unità Secondi
Dinamico Sì, si applica solo alle nuove transazioni InnoDB

È possibile impostare il aurora_transaction_timeout parametro a livello di cluster, istanza o sessione. Per ulteriori informazioni sull'utilizzo dei gruppi di parametri, vedereGruppi di parametri per Amazon Aurora.

Comportamento del timeout

Il aurora_transaction_timeout parametro si applica alle transazioni InnoDB che eseguono istruzioni DML, incluse le transazioni di sola lettura. Tutte le istruzioni di commit implicite, ad eccezione di CREATE TABLE .. AS SELECT (CTAS) eLOAD DATA, sono escluse dal timeout. Il valore di timeout viene acquisito quando viene eseguita la prima istruzione InnoDB. Il valore rimane fisso per tutta la durata di tale transazione.

Allo scadere del timeout, il risultato dipende dallo stato della transazione:

  • Se nella transazione è presente un'interrogazione attiva, la query viene interrotta e la transazione viene ripristinata. La connessione rimane utilizzabile.

  • Se non è presente alcuna query attiva (ovvero, la transazione è inattiva), la connessione viene interrotta.

Esempi

Gli esempi seguenti mostrano quando il timer si avvia per diversi scenari di transazione.

Transazione esplicita

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

Il timer inizia dall'istruzione 2 (la prima istruzione InnoDB).

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.

Il timer parte dall'istruzione 2 (la prima istruzione InnoDB dopo l'autocommit è disabilitata).

Stored procedure

Una procedura memorizzata viene eseguita nel contesto della transazione del chiamante. Se il chiamante ha già una transazione InnoDB attiva, il timer era già stato avviato prima della chiamata alla procedura. Se la procedura è la prima cosa a toccare InnoDB, il timer parte dalla prima istruzione InnoDB all'interno della procedura.

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

Note chiave

  • Il timeout viene acquisito all'inizio della transazione: il valore di timeout viene acquisito quando viene eseguita la prima istruzione InnoDB. La modifica aurora_transaction_timeout nel bel mezzo di una transazione ha effetto sulla transazione successiva, non su quella corrente. Non viene emesso alcun avviso.

  • Le transazioni XA PREPARED sono escluse: le transazioni preparate non sono soggette aaurora_transaction_timeout.

  • Le sessioni di inoltro in scrittura non sono soggette al timeout della transazione: quando l'inoltro in scrittura è abilitato, qualsiasi dichiarazione o transazione che contiene una dichiarazione inoltrata non è soggetta a. aurora_transaction_timeout Le transazioni successive nella stessa sessione che non includono dichiarazioni inoltrate sono soggette a timeout come di consueto. Per controllare il timeout di inattività delle transazioni inoltrate, puoi utilizzare il parametro. aurora_fwd_writer_idle_timeout Per ulteriori informazioni, consulta Parametri di configurazione per l'inoltro di scrittura in Aurora MySQL.

  • Fai attenzione con valori di timeout elevati: quando viene eseguito il rollback di una transazione di lunga durata, il rollback può richiedere diverse volte più tempo rispetto alle operazioni di modifica dei dati originali. L'interruzione del processo del database non aiuta perché il rollback si riavvia all'avvio del server. Scegli un valore di timeout che bilanci le esigenze del carico di lavoro con i costi di rollback. Per ulteriori informazioni, consulta Optimizing InnoDB Transaction Management nella documentazione MySQL.

Errore del client

Quando una transazione con una query attiva supera il timeout, il client riceve il seguente errore:

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

Quando una transazione inattiva supera il timeout, la query successiva riceve lo stesso errore dell'errore MySQL «server gone away». Per ulteriori informazioni, vedi MySQL server has gone away nella documentazione MySQL.

Log di errori

Un messaggio informativo viene scritto nel log degli errori del database quando si verifica un timeout della transazione:

[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
Nota

Questo messaggio di registro è solo a scopo diagnostico. Affidati alla risposta del cliente come indicatore definitivo di una transazione scaduta.

Monitoraggio dei timeout delle transazioni

Utilizza la variabile di Aurora_transaction_timeouts status per tenere traccia del numero di transazioni scadute dal riavvio dell'istanza DB.

SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';

Quando performance_schema è abilitata, l'errore di timeout (ER_AURORA_TRANSACTION_TIMEOUT_ERROR) viene registrato anche nelle tabelle correlate. performance_schema.events_errors_summary_global_by_error Nota che solo i timeout delle transazioni attive incrementano questo contatore; i timeout delle transazioni inattive interrompono la connessione senza generare l'errore. ER_AURORA_TRANSACTION_TIMEOUT_ERROR

Interazione con altri timeout

aurora_transaction_timeoutFunziona insieme ai parametri di timeout esistenti. Se una transazione rimane aperta più a lungo di quella configurataaurora_transaction_timeout, viene terminata indipendentemente dalle altre impostazioni di timeout. Il fatto che anche altri timeout annullino la transazione dipende dalla loro implementazione. Per i dettagli su questi parametri, consulta la documentazione di MySQL.