2013-07-20 2 views
2

Мы выполняем довольно большие транзакции в базе данных SQLite, что приводит к увеличению размера файла WAL. (Иногда до 1 ГБ для крупных транзакций.) Есть ли способ проверить файл WAL в середине транзакции? Когда я пытаюсь позвонить sqlite3_wal_checkpoint() или выполнить инструкцию PRAGMA контрольной точки WAL, оба возвращают SQLITE_BUSY.Можно проверить контрольную точку файла WAL во время транзакции?

ответ

4

Не совсем. Это целая точка транзакций: WAL (или файл журнала) сохраняет данные, которые станут официальными после успешного выполнения. Пока это не произойдет, если что-то пойдет не так - сбой программы, перезагрузка компьютера и т. Д., WAL или файл журнала позволяют безопасно откатить (отменить) незафиксированное действие. Перемещение только части этой незафиксированной транзакции приведет к победе над этой целью.

Обратите внимание, что документация SQLite определяет check-pointing как moving the WAL file transactions back into the database. Другими словами, контрольная точка перемещает одну или несколько транзакций из WAL, но не является частью огромной незафиксированной транзакции.

Есть несколько возможных решений вашей проблемы:

  • Избегайте большие сделки - совершающие в мелких кусках, если вы можете. Конечно, это не всегда возможно, в зависимости от вашего приложения.
  • Используйте старый режим ведения журнала с PRAGMA journal_mode=DELETE. Он немного медленнее, чем новый режим WAL (с PRAGMA journal_mode=WAL), но по моему опыту он имеет тенденцию создавать гораздо более мелкие файлы журналов, и они удаляются, когда транзакция успешно завершается. Например, Android 4.x по-прежнему использует старый режим ведения журнала - он работает быстрее во флэш и не создает огромные временные файлы или файлы журналов.
+0

К сожалению, для нашего приложения мы не можем (на данный момент) передать транзакцию на более мелкие. Это был ответ, который я ожидал, но я надеялся, что существует несколько простых в использовании методов для хранения файла WAL во время крупных транзакций. Спасибо хоть! – zanneth

Смежные вопросы