REPEATABLE READ como padrão no InnoDB
Pergunta
O nível de isolamento padrão do InnoDB é REPEATABLE READ. O que isso garante e o que ainda pode te surpreender?
Resposta esperada
Em REPEATABLE READ, todas as leituras 'snapshot' (SELECT simples) dentro de uma transação enxergam o banco como estava no momento da primeira leitura — leituras repetidas dão o mesmo resultado, sem dirty read nem non-repeatable read. O que surpreende: (1) leituras 'locking' (`SELECT ... FOR UPDATE`, `UPDATE`, `DELETE`) NÃO usam o snapshot — elas veem a versão mais recente comitada, então dá pra um `UPDATE` afetar linhas que um `SELECT` anterior na mesma transação não 'via'. (2) O InnoDB usa next-key locks pra prevenir a maioria dos phantom reads nesse nível (mais forte que o padrão SQL exige), o que também aumenta a chance de deadlock em cargas concorrentes. (3) Transações longas seguram o snapshot e fazem o undo log crescer.
Por que perguntam isso
Pergunta sênior de MySQL. O detalhe que separa: 'leitura com lock não usa o snapshot' — pega quase todo mundo de surpresa.