# ADR-13 — Un solo processo, un solo file SQLite - **Stato:** Accettata - **Area:** Configurazione e ambiente - **Fonte di verità per:** la scelta di progetto descritta qui sotto; i requisiti (`PREFISSO-NN`) che la attuano stanno nei documenti di dominio, indicati nelle *Conseguenze*. ## Decisione **Un solo processo, un solo file SQLite** (modalità WAL con `busy_timeout`, `synchronous=FULL`, `BEGIN IMMEDIATE` per ogni transazione che sposta denaro, vedi [architettura.md](../architettura.md#database), B-88). Canale SSE, blocchi per-utente, limitatori di tentativi e cache sono in memoria. - *Motivazione:* semplicità a scala di ~100 utenti concorrenti. - *Alternative scartate:* Redis o un database con lock condivisi, da non introdurre in via speculativa. - *Conseguenze:* nessuna distribuzione su più worker ([LIM-18]). L'unico invariante che non dipende dal processo singolo è «al più un round attivo», garantito da un indice ([ADR-22](ADR-22-piu-round-attivo-come-invariante-database.md)). *Codice:* `app/db/base.py:_register_sqlite_pragmas` · `app/db/base.py:begin_immediate` · `app/tx/locks.py:UserLocks` · `app/rounds/events.py:RoundEventBroadcaster` · *Test:* `tests/unit/test_db_base.py` · `tests/unit/test_sqlite_transactions.py`