【发布时间】:2012-01-12 00:03:55
【问题描述】:
有没有办法在 Python 中显式获取 sqlite3 数据库的锁?
【问题讨论】:
有没有办法在 Python 中显式获取 sqlite3 数据库的锁?
【问题讨论】:
显式锁定数据库的方法是启动事务,如documentation 中所述:
当一个数据库被多个连接访问,并且其中一个进程修改了数据库时,SQLite 数据库将被锁定,直到该事务被提交。
发起交易的一种方法是使用connection as a context manager:
import sqlite3
con = sqlite3.connect(...)
...
with con:
# Database is locked here
另请注意,某些事务默认发生在implictly:
默认情况下,sqlite3 模块在数据修改语言 (DML) 语句(即 INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非 DML、非查询语句(即任何其他语句)之前隐式提交事务比 SELECT 或上述)。
【讨论】:
with,python 也会锁定 sqlite db(文件)以防止未来的连接,直到 con.close()。我建议time.sleep(10) 在con.close() 和SELECT 之前两次。
来自 sqlite 常见问题解答,"Can multiple applications or multiple instances of the same application access a single database file at the same time?":
多个进程可以同时打开同一个数据库。 多个进程可以同时执行 SELECT。但只有 一个进程可以随时更改数据库 然而,时间。
无论您是否使用with connection 构造,许多进程都可以读取,在任何给定时间只有一个可以写入数据库。
【讨论】:
我们可以使用多处理命令来锁定数据库的读写进程。我正在使用以下命令,它工作正常:
from multiprocessing import Lock
l.Lock()
l.acquire()
# Read/Write DB
l.release()
【讨论】: