Python 使用sqlite3并发编写

Python 使用sqlite3并发编写,python,concurrency,sqlite,Python,Concurrency,Sqlite,我正在使用sqlite3python模块将批处理作业的结果写入一个公共.db文件。我之所以选择SQLite,是因为多个进程可能试图同时编写,据我所知,SQLite应该很好地处理这个问题。我不确定的是当多个进程同时完成并尝试写入时会发生什么。如果有几个过程看起来像这样 conn = connect('test.db') with conn: for v in xrange(10): tup = (str(v), v) conn.execute("ins

我正在使用
sqlite3
python模块将批处理作业的结果写入一个公共
.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)

立即执行,他们会抛出异常吗?礼貌地等待其他进程写入?有没有更好的办法

当写入数据库时,
sqlite
库将为每个进程锁定数据库,每个进程将等待释放锁以获得相应的权限

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


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

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

不建议将数据库文件放在网络共享中

更新:


您可能还需要检查隔离级别:

好消息是,SQLLite库隐式地使用一个事务,该事务在执行DML时锁定数据库。这意味着对数据库的其他并发访问将等待执行DML请求通过提交/回滚事务完成。但是请注意,多个进程可以同时执行SELECT


另外,请参阅第11.13.6节“控制事务”下的部分,详细说明如何控制事务。

那么,在连接时是否启用了锁,或者在提交时是否启用了锁?写入时会抓取锁。@MartijnPieters。。。当从提交函数调用返回时,锁被释放。还是我错了?你是对的;一旦提交完成,锁将被释放,因为数据库不再需要写入。有关锁如何工作的详细信息,请参阅。不确定这是否是dup:我问的是特定python模块的行为,而不是一般的SQLite。