Tempo limite de transação no Amazon Aurora MySQL
O parâmetro aurora_transaction_timeout define a duração máxima de uma transação. Esse parâmetro pode ajudar a impedir que transações de longa duração (ativas ou ociosas) bloqueiem a limpeza do InnoDB
Tópicos
Detalhes do parâmetro
O parâmetro aurora_transaction_timeout encerra qualquer transação do InnoDB que permaneça ativa por mais tempo que a duração especificada, incluindo transações somente leitura. O valor é especificado em segundos. Um valor igual a zero (o padrão) desabilita o tempo limite.
A tabela a seguir resume os detalhes do parâmetro.
| Propriedade | Valor |
|---|---|
| Nome | aurora_transaction_timeout |
| Escopo | Sessão, Global |
| Padrão | 0 (desabilitado) |
| Unidade | Segundos |
| Dinâmico | Sim, aplica-se somente a novas transações do InnoDB |
É possível definir o parâmetro aurora_transaction_timeout no nível do cluster, da instância ou da sessão. Consulte mais informações sobre como trabalhar com grupos de parâmetros em Grupos de parâmetros para Amazon Aurora.
Comportamento do tempo limite
O parâmetro aurora_transaction_timeout aplica-se às transações do InnoDB que executam instruções DML, incluindo transações somente leitura. Todas as instruções de confirmação implícitaCREATE TABLE .. AS SELECT (CTAS) e LOAD DATA, estão excluídas do tempo limite. O valor do tempo limite é capturado quando a primeira instrução do InnoDB é executada. O valor permanece fixo durante toda a vida útil da transação.
Quando o tempo limite expira, o resultado depende do estado da transação:
-
Se houver uma consulta ativa na transação, a consulta será interrompida e a transação será revertida. A conexão permanece utilizável.
-
Se não houver uma consulta ativa (ou seja, se a transação estiver ociosa), a conexão será encerrada.
Exemplos
Os exemplos a seguir mostram quando o cronômetro é iniciado para diferentes cenários de transação.
Transação explícita
BEGIN; -- Does NOT start InnoDB transaction. No timer. SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE (at statement 2).
O cronômetro é iniciado na instrução 2 (a primeira instrução do 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.
O cronômetro é iniciado na instrução 2 (a primeira instrução do InnoDB depois que o autocommit é desabilitado).
Procedimentos armazenados
Um procedimento armazenado é executado dentro do contexto de transação do chamador. Se o chamador já tiver uma transação ativa do InnoDB, o cronômetro já terá sido iniciado antes da chamada do procedimento. Se o procedimento for a primeira operação a acessar o InnoDB, o cronômetro será iniciado na primeira instrução do InnoDB dentro do procedimento.
BEGIN; CALL my_proc(); -- If my_proc() does SELECT/INSERT, timer starts at that first InnoDB statement inside the proc
Notas principais
-
O tempo limite é capturado no início da transação: o valor do tempo limite é capturado quando a primeira instrução do InnoDB é executada. Alterar
aurora_transaction_timeoutno meio de uma transação entra em vigor na próxima transação, e não na transação atual. Nenhum aviso é emitido. -
Transações XA PREPARED são excluídas: as transações preparadas não estão sujeitas a
aurora_transaction_timeout. -
Sessões de encaminhamento de gravação não estão sujeitas ao tempo limite de transação: quando o encaminhamento de gravação está habilitado, nenhuma instrução ou transação que contenha uma instrução encaminhada está sujeita a
aurora_transaction_timeout. As transações subsequentes na mesma sessão que não incluam instruções encaminhadas estão sujeitas ao tempo limite normalmente. Para controlar o tempo limite de ociosidade das transações encaminhadas, é possível usar o parâmetroaurora_fwd_writer_idle_timeout. Para obter mais informações, consulte Parâmetros de configuração para o encaminhamento de gravação no Aurora MySQL. -
Tenha cuidado com valores de tempo limite altos: quando uma transação de longa duração é revertida, a reversão pode levar várias vezes mais tempo que as operações originais de alteração de dados. Encerrar o processo do banco de dados não ajuda, pois a reversão é reiniciada na inicialização do servidor. Escolha um valor de tempo limite que equilibre as necessidades da workload com o custo da reversão. Consulte mais informações em Optimizing InnoDB Transaction Management
na documentação do MySQL.
Erro do cliente
Quando uma transação com uma consulta ativa excede o tempo limite, o cliente recebe o seguinte erro:
ERROR 63952 (40001): Transaction exceeded maximum allowed duration of <N> seconds and was rolled back. See aurora_transaction_timeout for configuring this behavior.
Quando uma transação ociosa excede o tempo limite, a consulta subsequente recebe o mesmo erro que o erro do MySQL “server gone away”. Consulte mais informações em MySQL server has gone away
Log de erros
Uma mensagem informativa é gravada no log de erros do banco de dados quando ocorre um tempo limite de transação:
[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
Essa mensagem de log serve apenas para fins de diagnóstico. Use a resposta do cliente como o indicador definitivo de que uma transação atingiu o tempo limite.
Monitorar tempos limite de transações
Use a variável de status Aurora_transaction_timeouts para acompanhar quantas transações atingiram o tempo limite desde que a instância de banco de dados foi reiniciada.
SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';
Quando performance_schema está habilitado, o erro de tempo limite (ER_AURORA_TRANSACTION_TIMEOUT_ERROR) também é rastreado em performance_schema.events_errors_summary_global_by_error e nas tabelas relacionadas. Observe que somente os tempos limite de transações ativas incrementam esse contador; os tempos limite de transações ociosas encerram a conexão sem gerar o erro ER_AURORA_TRANSACTION_TIMEOUT_ERROR.
Interação com outros tempos limite
O aurora_transaction_timeout funciona em conjunto com os parâmetros de tempo limite existentes. Se uma transação permanecer aberta por mais tempo que o aurora_transaction_timeout configurado, ela será encerrada independentemente das demais configurações de tempo limite. A ocorrência ou não de uma reversão da transação por outros tempos limite depende da implementação de cada um deles. Consulte detalhes sobre esses parâmetros na documentação do MySQL.