Мы выполняем довольно большие транзакции в базе данных SQLite, что приводит к увеличению размера файла WAL. (Иногда до 1 ГБ для крупных транзакций.) Есть ли способ проверить файл WAL в середине транзакции? Когда я пытаюсь позвонить sqlite3_wal_checkpoint()
или выполнить инструкцию PRAGMA контрольной точки WAL, оба возвращают SQLITE_BUSY.Можно проверить контрольную точку файла WAL во время транзакции?
2
A
ответ
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 по-прежнему использует старый режим ведения журнала - он работает быстрее во флэш и не создает огромные временные файлы или файлы журналов.
Смежные вопросы
- 1. Не удалось выполнить контрольную точку
- 2. Можно ли выбрать данные во время транзакции?
- 3. Редактировать контрольную точку TensorFlow
- 4. как проверить контрольную сумму кода во время выполнения
- 5. Как проверить идентификатор транзакции (TXN) во время проверки paypal
- 6. Отключить ограничения во время транзакции
- 7. Расположение записей во время транзакции
- 8. Запись удалена во время транзакции
- 9. Как проверить базу данных SQL Server во время транзакции?
- 10. Как выполнить контрольную точку из PL/SQL
- 11. Буферы WAL заполняются до совершения транзакции
- 12. postgresql: печатать транзакции из журналов WAL
- 13. Проверить статус файла во время цикла
- 14. Проверить статус файла во время sftp
- 15. Добавить контрольную точку файла в Xcode 4 через Applescript
- 16. Вычислить контрольную сумму MD5 для файла во время записи файла, в C
- 17. Можно ли проверить размер видео во время записи?
- 18. Можно ли приостановить время выполнения Транспортира и проверить местные вары?
- 19. Не удалось создать контрольную точку в gdb
- 20. Ошибка Couchbase Android, получающая удаленную контрольную точку
- 21. Иммидационная команда во время транзакции MySQL
- 22. Ожидание другого процесса во время транзакции DB
- 23. Спящие транзакции не откатываются во время тестирования
- 24. Переназначить конечную точку клиента во время выполнения
- 25. Как установить «контрольную точку» в объекте xts
- 26. Как проверить «этот» объект в Visual Studio во время отладки?
- 27. MSDTC Исключение во время транзакции: C#
- 28. Изменить контрольную точку Sprite, не перемещая ее?
- 29. Как установить контрольную точку внутри C# PresentationFramework.dll?
- 30. Xcode 6.4 как использовать контрольную точку исключения
К сожалению, для нашего приложения мы не можем (на данный момент) передать транзакцию на более мелкие. Это был ответ, который я ожидал, но я надеялся, что существует несколько простых в использовании методов для хранения файла WAL во время крупных транзакций. Спасибо хоть! – zanneth