Python sqlite3.0错误的原因“;锁定协议;例外?
为易失性SQLite3数据库(Python sqlite3.0错误的原因“;锁定协议;例外?,python,sqlite,Python,Sqlite,为易失性SQLite3数据库(PRAGMA journal\u mode=WAL)启用模式后,我的并发测试开始引发此错误。我发现,当Python进程分叉,并且在WAL模式下打开与数据库的连接时,就会发生这种情况。在该数据库上的任何后续execute(),即使使用新连接,也会抛出此锁定协议“异常 禁用WAL模式(PRAGMA journal\u mode=DELETE)会使问题消失,也不会出现任何“数据库已锁定”错误。“锁定协议”异常似乎反映了以下代码: SQLITE_协议结果代码表示SQLITE
PRAGMA journal\u mode=WAL
)启用模式后,我的并发测试开始引发此错误。我发现,当Python进程分叉,并且在WAL模式下打开与数据库的连接时,就会发生这种情况。在该数据库上的任何后续execute()
,即使使用新连接,也会抛出此锁定协议“
异常
禁用WAL模式(PRAGMA journal\u mode=DELETE
)会使问题消失,也不会出现任何“数据库已锁定”
错误。“锁定协议”
异常似乎反映了以下代码:
SQLITE_协议结果代码表示SQLITE使用的文件锁定协议存在问题
我正在Mac OS X 10.12.6上使用Python 2.7.10。我认为问题在于Python的sqlite3
模块以及如何处理分叉,而不是sqlite3本身的问题。我现在知道如何解决这个问题,但根据主要问题,这个问题的根本原因是什么?
另外,我没有使用任何线程,并且正在使用分叉。SQLite3显然不是线程安全的,但是,正如在对我的问题的评论中指出的,有一行代码与分叉相关: 在Unix下,不应通过fork()系统调用将打开的SQLite数据库带到子进程中 这并不能确切地回答原因,但它确实指出了一个解决方案:在
fork()
进程中(或之前)关闭所有SQLite连接!保持分叉连接可防止在任何过程中发生新连接 这是一个很好的例子。