

# Tiempo de espera de transacciones en Amazon Aurora MySQL
<a name="AuroraMySQL.TransactionTimeout"></a>

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](https://dev.mysql.com/doc/refman/8.4/en/glossary.html#glos_purge), lo que puede provocar problemas de rendimiento. Este parámetro está disponible en la versión 8.4.8 y versiones posteriores de Aurora MySQL.

**Topics**
+ [Detalles de los parámetros](#AuroraMySQL.TransactionTimeout.parameter-details)
+ [Comportamiento de los tiempos de espera](#AuroraMySQL.TransactionTimeout.behavior)
+ [Ejemplos](#AuroraMySQL.TransactionTimeout.examples)
+ [Notas clave](#AuroraMySQL.TransactionTimeout.key-notes)
+ [Error del cliente](#AuroraMySQL.TransactionTimeout.client-error)
+ [Registro de errores](#AuroraMySQL.TransactionTimeout.error-log)
+ [Supervisión de los tiempos de espera de las transacciones](#AuroraMySQL.TransactionTimeout.monitoring)
+ [Interacción con otros tiempos de espera](#AuroraMySQL.TransactionTimeout.interaction)

## Detalles de los parámetros
<a name="AuroraMySQL.TransactionTimeout.parameter-details"></a>

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](USER_WorkingWithParamGroups.md).

## Comportamiento de los tiempos de espera
<a name="AuroraMySQL.TransactionTimeout.behavior"></a>

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ícitas](https://dev.mysql.com/doc/refman/8.4/en/implicit-commit.html), excepto `CREATE 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
<a name="AuroraMySQL.TransactionTimeout.examples"></a>

En los ejemplos siguientes, se muestra cuándo se inicia el temporizador en diferentes escenarios de transacciones.

### Transacción explícita
<a name="AuroraMySQL.TransactionTimeout.examples.explicit"></a>

```
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
<a name="AuroraMySQL.TransactionTimeout.examples.autocommit"></a>

```
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
<a name="AuroraMySQL.TransactionTimeout.examples.stored-procs"></a>

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
<a name="AuroraMySQL.TransactionTimeout.key-notes"></a>
+ **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_timeout` en 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ámetro `aurora_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](aurora-global-database-write-forwarding-ams.md#aurora-global-database-write-forwarding-params-ams).
+ **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](https://dev.mysql.com/doc/refman/8.4/en/optimizing-innodb-transaction-management.html) en la documentación de MySQL.

## Error del cliente
<a name="AuroraMySQL.TransactionTimeout.client-error"></a>

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](https://dev.mysql.com/doc/refman/8.4/en/gone-away.html) en la documentación de MySQL.

## Registro de errores
<a name="AuroraMySQL.TransactionTimeout.error-log"></a>

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
<a name="AuroraMySQL.TransactionTimeout.monitoring"></a>

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
<a name="AuroraMySQL.TransactionTimeout.interaction"></a>

`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.