如何在Python中锁定sqlite3数据库?

6
有没有一种方法可以在Python中明确地获取sqlite3数据库的锁定?
3个回答

8

明确锁定数据库的方法是启动一个事务,如文档所述:

当多个连接访问数据库且其中一个进程修改了数据库时,SQLite数据库会被锁定,直到该事务提交。

启动事务的一种方法是使用连接作为上下文管理器

import sqlite3
con = sqlite3.connect(...)
...
with con:
    # Database is locked here

还要注意,默认情况下会发生一些事务 隐式地

默认情况下,sqlite3 模块在数据修改语言(DML)语句(即 INSERT/UPDATE/DELETE/REPLACE)之前隐式打开事务,并在非 DML、非查询语句(即除 SELECT 或上述语句之外的任何内容)之前隐式提交事务。


2
只是为了明确:如果我使用“with con”技巧,我是否保证在该块内与数据库的所有读写操作都一起进行?(也就是说,另一个线程不能更改我正在读取的内容)。 - Stephen Gross
2
我在https://dev59.com/3Gox5IYBdhLWcg3wpFz5发布了一个后续问题,询问如何在Python中锁定SQLite3数据库并请求澄清。 - Stephen Gross
似乎即使没有使用 withpython 也会锁定 sqlite 数据库(文件),直到 con.close()。我建议在 con.close() 前使用 time.sleep(10) 并执行两次 SELECT - ghchoi

4

这个答案的推论是被接受的答案是不正确的。使用事务是使多个数据库操作原子化的一种方式——也就是说,它们要么全部成功,要么全部失败,并且不会改变数据库。锁定意味着在两个线程/进程同时操作数据库时(无论是通过事务还是单个exec调用),防止冲突。多个线程/进程同时从数据库中读取是安全的,但如果一个线程正在对数据库进行更改(无论是作为事务还是单个exec调用),只有该线程可以运行。 - M Katz
此外,当它说“在任何时刻只有一个进程可以对数据库进行更改”时,您不必使用锁来保证。这已经由SQLite保证了。 - M Katz

1
我们可以使用多进程命令来锁定数据库的写入和读取过程。我正在使用以下命令,它运行良好:
from multiprocessing import Lock 
l.Lock()
l.acquire()
# Read/Write DB 
l.release()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接