В Windows:
tl; dr: попробуйте снова открыть файл.
Наша система столкнулась с этой проблемой, и она определенно не была проблемой с разрешениямиПоскольку сама программа могла бы открывать базу данных как доступную для записи из многих потоков большую часть времени, но иногда (только в Windows, а не в OSX), поток получал эти ошибки, даже если все остальные потоки в программе былибез проблем.
Мы в конечном итоге обнаружили, что отказавшие потоки были только теми, которые пытались открыть базу данных сразу после того, как другой поток закрыл ее (в течение 3 мс).Мы предположили, что проблема была в том, что Windows (или реализация sqlite под windows) не всегда сразу очищает файловые ресурсы при закрытии файла.Мы справились с этим, выполнив тестовый запрос на запись к базе данных при открытии (например, создав, а затем отбросив таблицу с глупым именем).Если создать / удалить не удалось, мы подождали 50 мс и попробовали еще раз, повторяя до тех пор, пока не добились успеха или не прошло 5 секунд.
Это сработало;по-видимому, просто нужно было достаточно времени, чтобы ресурсы вышли на диск.