sqlite3.OperationalError"锁定协议"的原因例外?

时间:2017-09-20 20:23:34

标签: python sqlite

为易失性SQLite3数据库(PRAGMA journal_mode = WAL)启用Write-Ahead Log模式后,我的并发测试开始引发此错误。我发现当Python进程被分叉并且在WAL模式下对数据库保持打开状态时会发生这种情况。该数据库上的任何后续execute(),即使使用新连接,也会引发此'locking protocol'异常。

禁用WAL模式(PRAGMA journal_mode = DELETE)会使问题消失,也不会发生任何'database is locked'错误。 'locking protocol'例外似乎反映了下面的SQLITE_PROTOCOL代码,其中记录为:

  

SQLITE_PROTOCOL结果代码表示SQLite使用的文件锁定协议存在问题。

我在Mac OS X 10.12.6 Sierra上使用Python 2.7.10。我认为问题出在Python的sqlite3模块中,以及它如何处理分叉,而不是SQLite3本身的问题。我现在知道如何解决这个问题但是根据主要问题,这个问题的根本原因是什么?

P.S。 - 我没有使用任何线程,而是spawning a daemon child分叉。

1 个答案:

答案 0 :(得分:0)

SQLite3显然不是per the FAQ的线程安全,但正如CL在我的问题的评论中指出的那样,与分叉相关的一行:< / p>

  

在Unix下,你不应该通过fork()系统调用将一个开放的SQLite数据库带入子进程。

这并没有确切地提供原因的答案,但它确实指出了一个解决方案:关闭所有 SQLite连接(或之前) fork()进程!保持分叉连接可防止在任何进程中发生新连接!