Действительно ли база данных SQLite останется нетронутой, если программа принудительно завершится при изменении базы данных? - PullRequest
2 голосов
/ 14 мая 2009

Документация SQLite говорит, что это транзакция .

Объяснение в связанной статье гласит, что если программа C ++, в которой статически связан код SQLite C ++, принудительно завершается (например, TerminateProcess () в WinAPI) или происходит сбой при выполнении записи, база данных остается неизменной - либо полностью обновленный, либо полностью без изменений.

Кто-нибудь действительно видел, что это надежно работает? Работает ли это безусловно или требует принятия каких-либо дополнительных мер?

Ответы [ 2 ]

4 голосов
/ 14 мая 2009

Поскольку не существует абсолютно безопасного способа выполнения атомарных транзакций, всегда есть вероятность иметь поврежденное состояние.

SQLite, однако, проявляет особую осторожность при фиксации и должен оставлять базу данных нетронутой даже в случае сбоя программы. Это безопаснее, чем использовать плоские файлы и цикл write-truncate-rename, который был проблемой в недавнем обсуждении ext4.

См. Атомная фиксация для справки о том, как это делается.

1 голос
/ 14 мая 2009

Это также зависит от режима вашего журнала. Если вы ведете журнал в файл, и база данных действительно повреждена, есть большая вероятность, что ее можно восстановить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...