Um lost update em quatro passos
Esta é uma execução real do exemplo bancário, gravada com a seed 42. Nada nesta página é simulado.
Dois saques leem o mesmo saldo
As duas transações leem $1,000 antes de qualquer uma escrever. Cada uma, sozinha, está correta.
Cada uma grava o seu resultado
A primeira debita $19 e salva $981. A segunda debita $11 e salva $989.
A segunda escrita apaga a primeira
A conta termina em $989 em vez de $970. Um débito de $19 sumiu e nenhum erro chega aos logs.
O ChaosSQL prova e entrega o teste
A invariante falha, o motor repete a ordem exata e o delta debugging mantém só as 2 transações que causam o bug, em repro_test.go.
- T1: BEGIN
- T2: BEGIN
- T1: SELECT balance FROM accounts WHERE id = 1;
- T2: SELECT balance FROM accounts WHERE id = 1;
- Saldo gravado
- $1,000
- Esperado
- $970
- Invariante
- verificada quando as duas fazem commit
repro_test.goDe 20 para 2 transações
Termos usados aqui
- Invariante
- Uma regra que seus dados precisam obedecer sempre, escrita como consulta SQL. Por exemplo: o saldo é igual ao saldo inicial menos todos os débitos.
- Nível de isolamento
- Quanto uma transação enxerga de outra que ainda está rodando. Níveis mais fracos são mais rápidos e permitem mais bugs como este.
- Seed
- Um número que fixa a ordem de todas as operações, para que a mesma seed repita a mesma execução.
