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