Sqlite数据库仍然锁定/不可访问
sqlite db remains locked/unaccessible
我有一个问题,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连接不做任何事情的时候,它是相对便宜的,而像缓存预处理语句这样的东西的成本实际上是相当小的;你想打开多少就打开多少
[编辑]:此外,这将解释关闭和重新打开连接的工作原理:它在新线程中构建连接(并在旧线程中完成所有锁等)。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 如何使用互斥锁锁定对布尔值的访问?
- 使用锁定XCMPCHG16B _ InterlockedCompareexchange128读取访问违规
- 锁定文件,避免使用相同的过程以访问两次
- 如何使用std::lock_guard锁定对std::map的读写访问
- 我创建锁定文件的功能导致访问冲突
- SQLite C++多个进程以只读模式访问数据库时"数据库已锁定"
- 如何为多线程访问实现类锁定对象
- 为什么在锁定weak_ptr时出现访问冲突?
- Sqlite数据库仍然锁定/不可访问
- 锁定互斥锁vs访问磁盘
- 让我在队列前端访问时锁定互斥对象
- 这些锁定的内存访问是等价的吗?
- 在Linux上锁定对单个进程内数据访问的最快方法