Camada Zero · 25 · Isolamento & MVCC

Duas transações mexendo na mesma linha ao mesmo tempo abrem brechas: dirty read, non-repeatable read, phantom. O nível de isolamento decide quais brechas você aceita. Roda o mesmo cenário em níveis diferentes aqui embaixo e veja a anomalia aparecer ou ser barrada.

T1

T2

Anomalia neste cenário
1Versões MVCC mantidas
T1 T2 anomalia leitura segura
Quem decide o nível é a transação, não o banco inteiro. O padrão da maioria dos bancos é Read Committed: você sobe o nível só onde a anomalia dói mais que a perda de concorrência.
NívelDirtyNon-repeatPhantom
Read Uncommittedpodepodepode
Read Committedbarrapodepode
Repeatable Readbarrabarrapode
Serializablebarrabarrabarra
Essa é a matriz do padrão SQL. No Postgres tem um detalhe: o Repeatable Read dele é snapshot isolation, então já barra phantom também.

Escolhendo o nível em Go

tx, err := db.BeginTx(ctx, &sql.TxOptions{
    Isolation: sql.LevelSerializable,
})
if err != nil { return err }
defer tx.Rollback()

// todas as queries usam tx, não db
if err := tx.Commit(); err != nil {
    // em Serializable o commit pode falhar
    // com erro de serialização: faça retry
    return err
}

Níveis disponíveis

sql.LevelReadCommitted
sql.LevelRepeatableRead
sql.LevelSerializable

🧠 Desafio — Isolamento & MVCC

Roda os cenários em níveis diferentes aqui de cima antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.