Tiempo de espera de transacciones en Amazon Aurora MySQL
El parámetro aurora_transaction_timeout establece la duración máxima de una transacción. Este parámetro puede ayudar a evitar que las transacciones de larga duración (activas o inactivas) bloqueen la purga de InnoDB
Temas
Detalles de los parámetros
El parámetro aurora_transaction_timeout finaliza cualquier transacción de InnoDB que se prolongue más allá de la duración especificada, incluidas las transacciones de solo lectura. El valor se especifica en segundos. Un valor de cero (el valor predeterminado) desactiva el tiempo de espera.
En la siguiente tabla se indican los detalles del parámetro.
| Propiedad | Valor |
|---|---|
| Nombre | aurora_transaction_timeout |
| Ámbito | Sesión, Global |
| Predeterminado | 0 (desactivado) |
| Unidad | Segundos |
| Dinámico | Sí, solo se aplica a las nuevas transacciones de InnoDB |
Puede establecer el parámetro aurora_transaction_timeout por clúster, instancia o sesión. Para obtener más información sobre el trabajo con grupos de parámetros, consulte Grupos de parámetros para Amazon Aurora.
Comportamiento de los tiempos de espera
El parámetro aurora_transaction_timeout se aplica a las transacciones de InnoDB que ejecutan instrucciones DML, incluidas las transacciones de solo lectura. Todas las instrucciones de confirmación implícitasCREATE TABLE .. AS SELECT (CTAS) y LOAD DATA, se excluyen del tiempo de espera. El valor de tiempo de espera se captura cuando se ejecuta la primera instrucción de InnoDB. El valor permanece fijo durante toda la duración de la transacción.
Cuando el tiempo de espera expira, el resultado depende del estado de la transacción:
-
Si hay una consulta activa en la transacción, la consulta se interrumpe y la transacción se revierte. La conexión sigue siendo utilizable.
-
Si no hay ninguna consulta activa (es decir, la transacción está inactiva), la conexión finaliza.
Ejemplos
En los ejemplos siguientes, se muestra cuándo se inicia el temporizador en diferentes escenarios de transacciones.
Transacción explícita
BEGIN; -- Does NOT start InnoDB transaction. No timer. SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE (at statement 2).
El temporizador comienza en la instrucción 2 (la primera instrucción de 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.
El temporizador comienza en la instrucción 2 (la primera instrucción de InnoDB después de que la confirmación automática se desactive).
Procedimientos almacenados
Un procedimiento almacenado se ejecuta dentro del contexto de la transacción de la persona que llama. Si la persona que llama ya tiene una transacción de InnoDB activa, el temporizador ya se había iniciado antes de la llamada del procedimiento. Si el procedimiento es lo primero que interactúa con InnoDB, el temporizador se inicia en la primera instrucción de InnoDB del procedimiento.
BEGIN; CALL my_proc(); -- If my_proc() does SELECT/INSERT, timer starts at that first InnoDB statement inside the proc
Notas clave
-
El tiempo de espera se captura al inicio de la transacción: el valor del tiempo de espera se captura cuando se ejecuta la primera instrucción de InnoDB. El cambio de
aurora_transaction_timeouten mitad de una transacción tiene efecto en la siguiente transacción, no en la actual. No se genera ninguna advertencia. -
Se excluyen las transacciones XA PREPARED: las transacciones preparadas no están sujetas a
aurora_transaction_timeout. -
Las sesiones de reenvío de escrituras no están sujetas a un tiempo de espera de transacción: cuando el reenvío de escrituras está habilitado, cualquier instrucción o transacción que contenga una instrucción reenviada no está sujeta a
aurora_transaction_timeout. Las transacciones posteriores de la misma sesión que no incluyan instrucciones reenviadas están sujetas a un tiempo de espera, como de costumbre. Para controlar el tiempo de espera de inactividad de las transacciones reenviadas, puede utilizar el parámetroaurora_fwd_writer_idle_timeout. Para obtener más información, consulte Parámetros de configuración para el reenvío de escritura en Aurora MySQL. -
Tenga cuidado con los valores de tiempo de espera altos: cuando se revierte una transacción de larga duración, la reversión puede tardar varias veces más que las operaciones de cambio de datos originales. Interrumpir el proceso de la base de datos no ayuda porque la reversión se reinicia al iniciar el servidor. Elija un valor de tiempo de espera que equilibre las necesidades de carga de trabajo con el costo de la reversión. Para obtener más información, consulte Optimizing InnoDB Transaction Management
en la documentación de MySQL.
Error del cliente
Cuando una transacción con una consulta activa supera el tiempo de espera, el cliente recibe el siguiente error:
ERROR 63952 (40001): Transaction exceeded maximum allowed duration of <N> seconds and was rolled back. See aurora_transaction_timeout for configuring this behavior.
Cuando una transacción inactiva supera el tiempo de espera, la consulta posterior recibe el mismo error que el error “server gone away” de MySQL. Para obtener más información, consulte MySQL server has gone away
Registro de errores
Cuando se agota el tiempo de espera de una transacción, se escribe un mensaje informativo en el registro de errores de la base de datos:
[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
Este mensaje de registro es solo para fines de diagnóstico. Confíe en la respuesta del cliente como indicador definitivo de que se ha agotado el tiempo de espera de una transacción.
Supervisión de los tiempos de espera de las transacciones
Utilice la variable de estado Aurora_transaction_timeouts para realizar un seguimiento del número de transacciones que han agotado el tiempo de espera desde que se reinició la instancia de base de datos.
SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';
Cuando performance_schema está habilitado, el error de tiempo de espera (ER_AURORA_TRANSACTION_TIMEOUT_ERROR) también se registra en performance_schema.events_errors_summary_global_by_error y las tablas relacionadas. Tenga en cuenta que solo los tiempos de espera de las transacciones activas incrementan este contador; los tiempos de espera de las transacciones inactivas terminan la conexión sin generar el error ER_AURORA_TRANSACTION_TIMEOUT_ERROR.
Interacción con otros tiempos de espera
aurora_transaction_timeout funciona junto con los parámetros de tiempo de espera existentes. Si una transacción permanece abierta durante más tiempo del aurora_transaction_timeout configurado, se termina independientemente de otras configuraciones de tiempo de espera. El hecho de que otros tiempos de espera también anulen la transacción depende de su propia implementación. Para obtener más información sobre estos parámetros, consulte la documentación de MySQL.