← MySQL: desenvolvimento e operação segura
03 / 12 · 40 MIN

Transações InnoDB e caminhos de erro

Mantém a unidade de negócio perante concorrência, deadlocks e timeouts.

Conceito e mecanismo

InnoDB usa REPEATABLE READ por omissão. Leituras consistentes simples reutilizam a snapshot estabelecida pela primeira leitura consistente da transação; locking reads e DML não devem ser tratados como se tivessem exatamente essa mesma visão. SELECT FOR UPDATE só protege uma decisão se a leitura e a alteração estiverem no âmbito transacional adequado. Transações curtas e ordem consistente de acesso reduzem contenção. SKIP LOCKED pode ser útil para workers de uma fila, mas omite linhas bloqueadas e não serve como relatório completo. A decisão inclui retoma de tarefas, efeitos externos e limites de espera.

Aplicação guiada

O tratamento de erro é parte da atomicidade de negócio. Um deadlock desfaz a transação inteira e exige uma nova tentativa completa, quando apropriada. Um lock wait timeout desfaz apenas o comando por omissão; innodb_rollback_on_timeout pode alterar esse comportamento. Num exemplo fictício, o débito termina e o crédito falha: um COMMIT automático num finally pode confirmar só o débito. Escolhe rollback ou retoma coerente e verifica o estado antes de devolver a conexão ao pool. Não uses um novo identificador de negócio para repetir cegamente uma operação cujo commit ficou incerto. Regista tentativas, resultado e razão da decisão.

NA PRÁTICA

Débito pendente + timeout do crédito + COMMIT pode produzir uma operação incompleta com sucesso técnico do commit.

Armadilhas comuns

Todo erro como rollback total; autocommit como lock duradouro; SKIP LOCKED como leitura completa.

Tópicos relacionados: Tipos e contratos dos dados · Consultas determinísticas e planos · Integração segura e identidade efetiva

Leva esta ideia contigo

Testa os caminhos de falha com a mesma atenção dada ao caminho de sucesso.

Criar conta

Referência: Statement versus transaction rollback · MySQL 9.7 LTS with InnoDB reference semantics

MySQL® é uma marca registada da Oracle e/ou das suas afiliadas. A dr.pt é uma plataforma de preparação independente e não está afiliada, associada, patrocinada, autorizada nem aprovada por Oracle. Os conteúdos e as perguntas são originais, não são perguntas oficiais de exame, e concluir os nossos testes não atribui nem garante qualquer certificação. Os nomes são usados apenas para identificar o tema. Todas as outras marcas pertencem aos respetivos titulares.