2017-09-20 8 views
0

揮発性SQLite3データベース(PRAGMA journal_mode = WAL)に対してWrite-Ahead Logモードを有効にした後、私の同時性テストでこのエラーが発生し始めました。私は、Pythonプロセスがforkされ、WALモードのデータベースに接続が開いたままになっているときに、これが発生することを発見しました。そのデータベース上の任意の後続の​​は、新しい接続を使用しても、'locking protocol'の例外をスローします。sqlite3.OperationalErrorの「ロックプロトコル」例外の原因?

WALモード(PRAGMA journal_mode = DELETE)を無効にすると、問題が解消され、'database is locked'エラーも発生しません。

SQLITE_PROTOCOL結果コードは、SQLiteのが使用するファイルロッキングプロトコルに問題があることを示している:'locking protocol'例外は、として記載されているの下SQLITE_PROTOCOLコードを反映すると思われます。

私はMac OS X 10.12.6 SierraでPython 2.7.10を使用しています。私はこの問題がPythonのsqlite3モジュールであり、SQLite3自体の問題ではなく、フォークされていることをどのように処理するのかと考えています。私は今問題を回避する方法を知っていますが、主な質問ごとに、この問題の根本原因は何ですか?

P. - 私はスレッドを使用していないし、spawning a daemon childでフォークしています。

+0

[FAQ](http://www.sqlite.org/faq.html#q6)です。 –

答えて

0

SQLite3のがper the FAQとして明らかにスレッドセーフではなく、CLは私の質問にコメントで指摘したように、がフォークに関連する行があります:UNIXで

、あなたが運ぶべきではありませんfork()システム間で開いているSQLiteデータベースが子プロセスを呼び出します。

これはまさにしかし、それは解決策を指摘しない、原因のような答えを提供していません:中(または前)fork()プロセス近いALL SQLiteの接続を!分岐した接続を保持することで、プロセス間で新しい接続が行われることを防ぎます!

関連する問題