Короткая версия
Если мой процесс завершается в середине транзакции или когда SQLite выполняет транзакцию, каковы шансы, что файл базы данных будет поврежден?
Длинная версия
Мое приложение использует базу данных SQLite для хранения (напрямую, а не через Core Data). Я работаю над новой версией приложения, которая потребует обновления схемы базы данных. При запуске приложение проверит базу данных и, если потребуется обновление, выполнит ряд операторов SQL для этого.
В зависимости от объема данных в базе данных, обновление может выполняться долго (порядка секунд), поэтому мне нужно учитывать возможность того, что процесс может быть остановлен до завершения обновления. (Для контекста, это на iPhone, где процессор работает медленно и приложение может быть прервано входящим телефонным звонком.) Я, конечно, заверну обновления операторов SQL в транзакции. Будет ли этого достаточно, чтобы гарантировать, что база данных не будет повреждена?
Я предполагаю, что транзакции работают так, как объявлено, и что если процесс завершится в середине транзакции, файл будет в порядке. Но я также предполагаю, что во время COMMIT есть время, когда что-то может пойти не так.
В целях безопасности я мог бы создать резервную копию файла базы данных перед началом обновления, но если транзакции безопасны, это было бы излишним. Это также сделает процесс обновления более длительным, что увеличит вероятность его прерывания, и тогда мне придется учитывать, что операция копирования файла может быть прервана ... Я хотел бы сделать код как можно более простым (но не проще).
В ходе исследования этого вопроса я начал читать « Атомная фиксация в SQLite », что более подробно, чем мне, вероятно, нужно знать, но дает мне веру в то, что мне не нужно переосмыслить способность SQLite защитить файл базы данных. Но я все еще хотел бы услышать от переполнения стека: достаточно ли хорошая транзакция или я должен быть более осторожным?