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语句都已执行后进行提交.
如果您的数据库具有唯一性约束,则可能是提交失败,因为一个进程已经添加了另一个进程与之冲突的行.
如果每个进程都拥有自己的连接,那应该没问题。会发生的情况是,写入进程时会锁定 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
| 归档时间: |
|
| 查看次数: |
13509 次 |
| 最近记录: |