Я использую базу данных SQLite в режиме WAL со многими подключениями для чтения и записи, поэтому я сталкиваюсь с проблемой нехватки контрольных точек: файл .db-wal постоянно растет. Чтобы противостоять этому, я время от времени запускаю pragma wal_checkpoint(TRUNCATE)
. В документации указывается:
Этот режим блокирует (вызывает обратный вызов занятого обработчика) до тех пор, пока не будет создателя базы данных, и все читатели не читают из самого последнего снимка базы данных
Но также:
Прагма wal_checkpoint возвращает одну строку с тремя целочисленными столбцами. Первый столбец обычно равен 0, но будет равен 1, если контрольная точка RESTART или FULL или TRUNCATE была заблокирована для завершения, например, потому что другой поток или процесс активно использовал базу данных.
На самом деле, в моем приложение почти всегда возвращает 1.
Разве это не противоречиво? Почему он не блокирует все остальные соединения, пока не завершится? Можно ли форсировать контрольно-пропускной пункт, поэтому я могу быть уверен, что он заблокирует все и завершит, несмотря ни на что?