Sqlite数据库仍然锁定/不可访问

sqlite db remains locked/unaccessible

本文关键字:访问 锁定 数据库 Sqlite      更新时间:2023-10-16

我有一个问题,sqlite3 db在一定的访问后仍然锁定/不可访问。

目前为止在Ubuntu 10.4和自定义(OpenEmbedded) Linux上发生的行为。sqlite版本是3.7.7.1)。Db是本地文件

一个c++应用程序周期性地(5s)访问数据库。每次完成几个插入语句时,将它们包装在一个延迟事务中。这只发生在一个线程中。到数据库的连接在应用程序的整个生命周期内保持。所使用的语句也是持久化的,可以通过sqlite3_reset重用。sqlite_threadsafe设置为1 (serialized), journaling设置为WAL

然后我用sqlite命令行工具并行打开sqlite数据库。我输入BEGIN IMMEDIATE;,等待>5s,然后用END;提交。

之后,应用程序的数据库访问失败:BEGIN TRANSACTION返回返回码1("SQL错误或丢失数据库")。如果我在开始之前执行ROLLBACK TRANSACTION,只是为了确保没有活动事务,它会失败并返回代码5("数据库文件被锁定")。

有谁知道如何解决这个问题,或者知道可能导致这个问题的原因吗?

EDIT:有一个解决方法:如果发生所描述的错误,我关闭并重新打开db连接。这就解决了这个问题,但是我现在不知道为什么会这样。

Sqlite是一个无服务器数据库。据我所知,它在设计上不支持多源并发访问。您正在尝试从应用程序和命令工具访问相同的备份文件-因此您尝试执行并发访问。

SQLite连接应该只在单线程中使用,因为它们包含用于确保正确并发访问的互斥锁。(请注意,SQLite也只支持一次一个更新线程,并且没有并发读取;这是作为一个无服务器数据库的限制)

幸运的是,当SQLite连接不做任何事情的时候,它是相对便宜的,而像缓存预处理语句这样的东西的成本实际上是相当小的;你想打开多少就打开多少

[编辑]:此外,这将解释关闭和重新打开连接的工作原理:它在新线程中构建连接(并在旧线程中完成所有锁等)。