ChaosSQL

Catálogo de Concorrência

Cenários Canônicos & Mitigações

Explore 10 cenários de falhas de concorrência baseados em pesquisas acadêmicas de isolamento e casos reais de sistemas financeiros e distribuídos.

G1a

Leitura Suja em Flash Crash (Dirty Read)

Bot de liquidação lê queda de margem não comitada de uma transação que subsequentemente sofre rollback.

Bot de liquidação lê queda de margem não comitada de uma transação que subsequentemente sofre rollback.

Schema e dados iniciais

schema.sql & seed.sql
-- Schema
CREATE TABLE margin_accounts (
    id INT PRIMARY KEY,
    trader TEXT NOT NULL,
    collateral INT NOT NULL,
    status TEXT NOT NULL
);

-- Seed
INSERT INTO margin_accounts VALUES (1, 'Whale_01', 50000, 'ACTIVE');

Carga concorrente (chaos.yaml)

chaos.yaml
version: "1.0"
name: "flash_crash_dirty_read"
operations:
  - name: "market_order_rollback"
    steps:
      - "UPDATE margin_accounts SET collateral = 5000 WHERE id = 1"
      - "SELECT 1/0" # Forced division by zero fault to trigger ROLLBACK
  - name: "liquidation_bot"
    steps:
      - "SELECT collateral FROM margin_accounts WHERE id = 1 -> col"
      - "UPDATE margin_accounts SET status = 'LIQUIDATED' WHERE id = 1 AND {col < 10000}"
invariants:
  - name: "no_spurious_liquidation"
    query: "SELECT collateral, status FROM margin_accounts WHERE id = 1;"
    assert: "collateral == 50000 AND status == 'ACTIVE'"

Por que a invariante quebra

T1 atualiza o colateral para $5000 e aborta em seguida. Sob READ UNCOMMITTED, T2 lê o colateral de $5000 não comitado e dispara a liquidação indevida de um trader solvente.

w1(collateral=5000) ... r2(collateral) ... a1

Delta debugging reduz 10 operações às 2 que causam a falha.

Correção em produção

Isolamento Mínimo READ COMMITTED no Pool de Conexões

Dirty Reads (G1a / Aborted Reads) ocorrem quando uma transação lê modificações feitas por outra transação que posteriormente sofre abort (ROLLBACK). Em finanças e criptoativos, isso acarreta liquidações catastróficas espúrias. A mitigação arquitetural exige que o pool de conexões configure como piso inviolável o isolamento READ COMMITTED, garantindo que leituras acessem apenas tuplas comitadas de forma duradoura no write-ahead log.

✓ PostgreSQL (Default)✓ SQLite (WAL)✓ MySQL (Default)

PostgreSQL (Default), SQLite (WAL), MySQL (Default)

remediation_fix.sql
-- Assegurar Nível de Isolamento Mínimo READ COMMITTED no Banco
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- Rotina de Liquidação com Validação Transacional
BEGIN;
SELECT collateral, status FROM margin_accounts WHERE id = 1 FOR UPDATE;
-- Apenas dados comitados são lidos! Transações abortadas nunca vazam.
UPDATE margin_accounts SET status = 'LIQUIDATED' WHERE id = 1 AND collateral < 10000;
COMMIT;