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

Ste*_*oss 6 python sqlite

有没有办法在 Python 中显式获取对 sqlite3 数据库的锁?

jco*_*ado 7

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

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

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

import sqlite3
con = sqlite3.connect(...)
...
with con:
    # Database is locked here
Run Code Online (Sandbox Code Playgroud)

另请注意,默认情况下某些交易是隐式发生的:

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

  • 需要明确的是:如果我使用“with con”技巧,我是否可以保证该块内数据库的所有读写操作都一起发生?(也就是说,另一个线程不能改变我正在阅读的内容)。 (2认同)
  • 我在 http://stackoverflow.com/questions/9070369/locking-a-sqlite3-database-in-python-re-asking-for-clarification 发布了一个后续问题 (2认同)

unu*_*tbu 5

来自 sqlite FAQ,多个应用程序或同一应用程序的多个实例可以同时访问单个数据库文件吗?

多个进程可以同时打开同一个数据库。多个进程可以同时执行 SELECT。但在任何时刻,只有一个进程可以对数据库进行更改。

无论您是否使用该with connection构造,在任何给定时间,许多进程都可以读取数据库,而只有一个进程可以写入数据库。