ChaosSQL

Motores

Motores Suportados & Arquitetura de Drivers

Guia de configuração e particularidades técnicas dos bancos de dados suportados: SQLite puro em Go (CGO=0 com WAL mode), PostgreSQL (pgx, READ COMMITTED vs SSI) e MySQL/MariaDB (InnoDB Repeatable Read e gap locks).

Arquitetura de Drivers e a Interface DatabaseDriver

O ChaosSQL interage com bancos de dados relacionais através de uma interface abstrata de alta performance definida em internal/drivers/driver.go:

type DatabaseDriver interface {
    DriverName() string
    Open(ctx context.Context) error
    Close() error
    Reset(ctx context.Context, schemaSQL, seedSQL string) error
    BeginTx(ctx context.Context) (Tx, error)
    QueryRow(ctx context.Context, query string, args ...any) *sql.Row
    Query(ctx context.Context, query string, args ...any) (*sql.Rows, error)
    Exec(ctx context.Context, query string, args ...any) (sql.Result, error)
}

O método Reset() é fundamental para o fuzzer determinístico: antes de cada iteração de teste ou passo de teste do algoritmo de Delta-Debugging (ddmin), o ChaosSQL reinicializa completamente o banco de dados, garantindo isolamento total de estado entre execuções.

Driver SQLite Puro em Go (modernc.org/sqlite)

Compilação Sem CGO (CGO_ENABLED=0)

Diferente de implementações baseadas em mattn/go-sqlite3 que exigem compilador C e bibliotecas compartilhadas, o ChaosSQL utiliza o driver modernc.org/sqlite. Isso permite compilar binários estáticos universais com zero dependências externas de compilação.

Configuração WAL e Concorrência

Durante o método Open(), o driver aplica automaticamente as configurações de alta concorrência do SQLite:

-- Habilita o modo Write-Ahead Logging para permitir leituras concorrentes com uma escrita
PRAGMA journal_mode = WAL;

-- Define o tempo de espera para aquisição de lock antes de falhar (5 segundos)
PRAGMA busy_timeout = 5000;

Strings de Conexão Suportadas (DSN)

  • :memory: ou file:chaos_mem?mode=memory&cache=shared: Banco em memória volátil, a opção mais rápida para suítes de teste no CI.
  • file:database.db: Banco persistido em arquivo local para testes de estresse em disco.

Driver PostgreSQL (pgx/v5)

O driver PostgreSQL do ChaosSQL utiliza o github.com/jackc/pgx/v5/stdlib, a biblioteca oficial de maior performance do ecossistema Go.

String de Conexão (DSN)

postgres://chaos_user:secret_pass@localhost:5432/chaostest?sslmode=disable

Reset com Drop Cascade

Para garantir estado imaculado antes de cada teste, o driver PostgreSQL executa:

DROP SCHEMA IF EXISTS public CASCADE;
CREATE SCHEMA public;

Semântica de Isolamento: READ COMMITTED vs REPEATABLE READ vs SERIALIZABLE

  • READ COMMITTED (Padrão do PostgreSQL): Cada instrução SQL enxerga um snapshot gerado no início daquela instrução específica (statement-level snapshot). É altamente vulnerável a Lost Update (P4) e Read Skew (A5A) se a aplicação realizar lógica Read-Modify-Write.
  • REPEATABLE READ: Implementa Snapshot Isolation (SI). A transação inteira enxerga um snapshot consistente capturado no instante da primeira instrução. Previne P4 e A5A, mas permanece vulnerável a Write Skew (A5B), pois transações com escritas disjuntas não colidem no motor de detecção de conflitos de escrita.
  • SERIALIZABLE: Ativa o algoritmo SSI (Serializable Snapshot Isolation) de Ports & Grittner (VLDB 2012). O motor monitora locks virtuais de leitura (SIREAD) e aborta transações que participam de ciclos de anti-dependência com o erro SQLSTATE 40001 (serialization_failure).

Tratamento de Deadlocks no PostgreSQL

O driver intercepta o erro SQLSTATE 40P01 (deadlock_detected) e o remapeia automaticamente para o tipo de erro canônico ErrDeadlockDetected, categorizado pelo ChaosSQL sob a anomalia G-DL.

Driver MySQL & MariaDB (go-sql-driver/mysql)

O driver MySQL utiliza github.com/go-sql-driver/mysql configurado com suporte a múltiplas instruções (multiStatements=true).

String de Conexão (DSN)

root:password@tcp(127.0.0.1:3306)/chaostest?parseTime=true&multiStatements=true

Particularidades do Motor de Armazenamento InnoDB

  • Nível Padrão REPEATABLE READ: Diferente do PostgreSQL, o InnoDB adota REPEATABLE READ como nível padrão.
  • Next-Key Locks e Gap Locks: O InnoDB bloqueia não apenas os registros encontrados, mas também os intervalos vazios (gaps) entre eles em índices ordenados, impedindo a ocorrência de leituras fantasmas (A3).
  • Deadlocks em Bloqueios Pessimistas: Transações concorrentes que executam SELECT ... FOR UPDATE sobre linhas com chaves secundárias são propensas a deadlocks de intervalo (Gap Deadlocks). O ChaosSQL captura o erro MySQL 1213 (ER_LOCK_DEADLOCK) e categoriza a anomalia.

Fuzzing Diferencial Cross-Engine com chaossql diff

O comando diff executa o mesmo cenário com a mesma semente PRNG contra dois motores diferentes simultaneamente, emitindo um relatório comparativo de divergência semântica:

chaossql diff specs/banking_lost_update.yaml \
  --driver-a=sqlite --dsn-a=":memory:" \
  --driver-b=postgres --dsn-b="postgres://user:pass@localhost:5432/chaostest" \
  --seed=42