Transações em bancos de dados SQL são ACID:
- Atômicas (uma transação não pode ser dividida e tratada em partes)
- Consistentes (uma transação interrompida não deixa vestígios)
- Isoladas (uma transação nunca interage com outra até terminar)
- Duráveis (se algo acontecer errado, o banco saberá voltar as alterações. Persistentes seria melhor, mas ACIP fica estranho).
São características fantásticas do ponto de vista funcional, mas geram problemas. O isolamento é uma frequente causa de problemas de performance, porque faz com que as tabelas fiquem travadas em determinadas transações. Se uma tabela com atualizações frequentes é também alvo de consultas demoradas e complexas, que cobrem uma grande quantidade de registros, é possível que uma grande fila de processos se acumule.
A maneira simples de evitar isso é controlar o nível de isolamento (e romper o princípio ACID) utilizando o comando SET TRANSACTION ISOLATION LEVEL. Quatro variações são possíveis:
- SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, pra ler dados de quaisquer transações não-completadas
- SET TRANSACTION ISOLATION LEVEL READ COMMITTED, pra ler dados somente de transações completas, incluindo comandos internos
- SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, pra ler dados somente de transações completas
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, pra utilizar em conjunto com SELECT…LOCK IN SHARE MODE
A diferença real entre o READ COMMITED e o REPEATABLE READ acontece em transações com mais de um comando. Se você enviar, por exemplo, uma série de consultas e atualizações dentro de uma mesma transação, os dois modos lerão dados de pontos diferentes:
- READ COMMITED atualizará os dados de leitura a cada comando. Um update em seguida do outro utilizará os dados atualizados, respeitando a transação no qual eles se encontram.
- REPEATABLE READ utilizará sempre um único conjunto de dados inicial. Se você efetuar várias atualizações, as leituras serão feitas do mesmo conjunto inicial sempre, relativo ao início da transação. Esse é o modo padrão no MySQL.

Muito bom o post. Parabéns!