有没有一种方法可以在Python中明确地获取sqlite3数据库的锁定?
明确锁定数据库的方法是启动一个事务,如文档所述:
当多个连接访问数据库且其中一个进程修改了数据库时,SQLite数据库会被锁定,直到该事务提交。
启动事务的一种方法是使用连接作为上下文管理器:
import sqlite3
con = sqlite3.connect(...)
...
with con:
# Database is locked here
还要注意,默认情况下会发生一些事务 隐式地:
默认情况下,sqlite3 模块在数据修改语言(DML)语句(即 INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非 DML、非查询语句(即除 SELECT 或上述语句之外的任何内容)之前隐式提交事务。
来自sqlite FAQ的问题,"多个应用程序或同一应用程序的多个实例是否可以同时访问单个数据库文件?":
多个进程可以同时打开同一个数据库。 多个进程可以同时进行SELECT查询。但是,在任何时刻只有一个进程可以对数据库进行更改。
无论您是否使用with connection
结构,许多进程可以从中读取,但每次只能有一个进程写入数据库。
from multiprocessing import Lock
l.Lock()
l.acquire()
# Read/Write DB
l.release()
with
,python
也会锁定 sqlite 数据库(文件),直到con.close()
。我建议在con.close()
前使用time.sleep(10)
并执行两次SELECT
。 - ghchoi