可以以只读模式打开锁定的sqlite数据库吗?
我想用python-sqlite3打开chromium的网站数据,这些数据存放在~/.config/chromium/Default文件夹里。但是每次当chromium在运行的时候,这个数据库都会被锁住。这是可以理解的,因为可能会有数据正在被修改。那么,有没有办法以只读模式打开它,这样我就不会在chromium使用它的时候破坏数据库的完整性呢?
3 个回答
Chromium在长时间内占用数据库锁?真糟糕!这可不是个好主意。不过,这并不是你的错……
你可以尝试复制数据库文件(比如用系统工具cp
),然后用这个快照来读取数据;SQLite会把所有提交的状态保存在每个数据库的一个文件里。是的,可能会看到部分事务的数据,但在Unix系统上你肯定不会遇到锁的问题,因为SQLite并不使用强制锁。(在Windows上可能不行,因为那里的锁定机制不同。)
看起来我们可以通过以 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
传递。
我觉得这要看事务设置的锁。
https://www.sqlite.org/lockingv3.html#shared_lock
https://www.sqlite.org/lang_transaction.html
在SQLite中,独占事务会锁住所有的读和写,而立即事务和延迟事务则还是允许其他人读取。
所以这实际上取决于Chromium使用的事务类型。