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:oufile: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 SQLSTATE40001 (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 adotaREPEATABLE READcomo 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 UPDATEsobre linhas com chaves secundárias são propensas a deadlocks de intervalo (Gap Deadlocks). O ChaosSQL captura o erro MySQL1213 (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