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.
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
Testa os caminhos de falha com a mesma atenção dada ao caminho de sucesso.
Referência: Statement versus transaction rollback · MySQL 9.7 LTS with InnoDB reference semantics