Unter Windows:
tl; dr: Versuchen Sie erneut, die Datei zu öffnen.
Unser System hatte dieses Problem, und es war definitiv kein Berechtigungsproblem, da das Programm selbst in der Lage wäre, die Datenbank die meiste Zeit schreibbar von vielen Threads zu öffnen, aber gelegentlich (nur unter Windows) auf OSX), würde ein Thread diese Fehler bekommen, obwohl alle anderen Threads im Programm keine Schwierigkeiten hatten.
Wir fanden schließlich heraus, dass die fehlgeschlagenen Threads nur diejenigen waren, die versuchten, die Datenbank sofort zu öffnen, nachdem ein anderer Thread sie geschlossen hatte (innerhalb von 3 ms). Wir spekulierten, dass das Problem auf die Tatsache zurückzuführen ist, dass Windows (oder die sqlite-Implementierung unter Windows) beim Schließen einer Datei nicht immer sofort Dateiressourcen bereinigt. Wir umgehen das, indem wir beim Öffnen eine Test-Write-Abfrage gegen die db ausführen (z. B. Erstellen, dann Löschen einer Tabelle mit einem dummen Namen). Wenn das Erstellen/Ablegen fehlgeschlagen ist, haben wir 50 ms gewartet und es erneut versucht, bis wir erfolgreich waren oder 5 Sekunden verstrichen sind.
Es funktionierte; Offensichtlich brauchte es nur genug Zeit, um die Ressourcen auf die Festplatte zu übertragen.
Hat der Benutzer, der sqlite3 ausführt (oder was auch immer Sie zum Ausführen der Abfrage verwenden) Schreibberechtigungen für die Datenbank? Haben Sie den Besitz von Dateien überprüft? –
Ich bin sicher, sie haben die Erlaubnis, es zu tun. – user143482
Ich habe das in einer Web-App gesehen, wo ich vergessen habe, die GID auf die Datenbankdatei zu setzen und das "www-data" Konto (unter dem Apache läuft) wurde Schreibzugriff auf die Datei verweigert. – finnw