使用sqlite3同时编写

She*_*hep 12 python sqlite concurrency

我正在使用sqlite3python模块将批处理作业的结果写入公共.db文件.我之所以选择SQLite,是因为多个进程可能会同时尝试编写,而且据我所知,SQLite应该很好地处理这个问题.我不确定的是当多个进程完成并尝试同时写入时会发生什么.所以,如果有几个流程看起来像这样

conn = connect('test.db')

with conn: 
    for v in xrange(10): 
        tup = (str(v), v)
        conn.execute("insert into sometable values (?,?)", tup)
Run Code Online (Sandbox Code Playgroud)

立即执行,他们会抛出异常吗?礼貌地等待其他进程写?有没有更好的方法来做到这一点?

Mar*_*ers 22

在写入sqlite数据库时,库将按进程锁定数据库,并且每个进程将等待锁定被释放以轮到他们.

但是,在提交时间之前不需要写入数据库.您正在使用连接作为上下文管理器(好!),因此在循环完成并且所有insert语句都已执行后进行提交.

如果您的数据库具有唯一性约束,则可能是提交失败,因为一个进程已经添加了另一个进程与之冲突的行.

  • 有关锁定如何工作的详细信息,请参见http://www.sqlite.org/lockingv3.html. (4认同)
  • 你是对的; 一旦提交完成,锁就会被释放,因为数据库不再需要写入。 (2认同)

kur*_*cew 6

如果每个进程都拥有自己的连接,那应该没问题。会发生的情况是,写入进程时会锁定 DB,因此所有其他进程都会阻塞。如果超过等待数据库空闲的超时时间,它们将抛出异常。可以通过 connect 调用配置超时时间:

http://docs.python.org/2/library/sqlite3.html#sqlite3.connect

不建议您将 DB 文件放在网络共享中。

更新:

您可能还想检查隔离级别:http : //docs.python.org/2/library/sqlite3.html#sqlite3.Connection.isolation_level