SQLite's documentation about its durability properties is unclear
SQLite и надёжность: бардак в настройках
Надёжность (durability) — гарантия, что после COMMIT изменения сохранятся даже при падении ОС или отключении питания. На Linux это обеспечивается вызовом fsync. Цена — производительность, поэтому СУБД дают «ручки» для настройки. Главное, чтобы документация чётко объясняла, что включено по умолчанию.
У SQLite всё запутано. Два ключевых параметра:
journal_mode(DELETE | WAL …)synchronous(EXTRA, FULL, NORMAL, OFF)
По документации:
- По умолчанию
journal_mode=DELETE,synchronous=FULL. - В режиме DELETE
FULLне гарантирует надёжность; нуженEXTRA. - В режиме WAL
FULLуже достаточно.
Вывод: «из коробки» SQLite не надёжна; переключившись на WAL — становится.
Однако Ричард Хипп (автор SQLite) в комментарии на HN утверждает прямо противоположное:
- «В конфигурации по умолчанию SQLite надёжна».
- «Если включить WAL, по умолчанию надёжность теряется».
Документация и автор расходятся.
Дополнительные ловушки:
- Обертки могут переопределять
synchronous. Популярный драйвер Go для SQLite ставитNORMALв WAL-режиме — надёжности нет. - На macOS
fsyncработает не как на Linux, что тоже снижает гарантии.
Итого: чтобы быть уверенным, явно задайте
PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;