可以以只读模式打开锁定的sqlite数据库吗?

19 投票
3 回答
9730 浏览
提问于 2025-04-17 04:48

我想用python-sqlite3打开chromium的网站数据,这些数据存放在~/.config/chromium/Default文件夹里。但是每次当chromium在运行的时候,这个数据库都会被锁住。这是可以理解的,因为可能会有数据正在被修改。那么,有没有办法以只读模式打开它,这样我就不会在chromium使用它的时候破坏数据库的完整性呢?

3 个回答

7

Chromium在长时间内占用数据库锁?真糟糕!这可不是个好主意。不过,这并不是你的错……

你可以尝试复制数据库文件(比如用系统工具cp),然后用这个快照来读取数据;SQLite会把所有提交的状态保存在每个数据库的一个文件里。是的,可能会看到部分事务的数据,但在Unix系统上你肯定不会遇到锁的问题,因为SQLite并不使用强制锁。(在Windows上可能不行,因为那里的锁定机制不同。)

11

看起来我们可以通过以 immutable 模式打开数据库来绕过锁定,比如:

sqlite3 'file:places.sqlite?immutable=1'

这里有详细解释 https://www.sqlite.org/c3ref/open.html

不过,如果底层的数据库文件发生变化,这可能会导致查询错误,或者你会明显看不到对文件所做的更新。但我发现每次新查询时重新打开连接可以解决这个问题。

要用大多数 SQLite 驱动程序实现相同的效果,因为我们不能直接设置 SQLITE_IOCAP_IMMUTABLE,最好的方法是用标志 SQLITE_OPEN_READONLY | SQLITE_OPEN_URI 打开连接,这样就可以通过 file:...?immutable=1 的 URI 作为 filename 传递。

8

我觉得这要看事务设置的锁。

https://www.sqlite.org/lockingv3.html#shared_lock
https://www.sqlite.org/lang_transaction.html

在SQLite中,独占事务会锁住所有的读和写,而立即事务和延迟事务则还是允许其他人读取。

所以这实际上取决于Chromium使用的事务类型。

撰写回答