2

我正在使用一个 C++ shell 扩展 DLL,它用于读取、写入数据到 SQLite 数据库表中。还有另一个用于访问所有表的应用程序(exe)。

有时,当我尝试删除/插入/更新 SQLite 数据库表时,我的 dll 会显示异常“数据库文件已锁定”。这是因为此时其他应用程序正在访问这些表。

有什么办法可以从我的 DLL 中解决这个问题?我可以使用链接中提到的解决方案吗:“ http://stackoverflow.com/questions/6455290/implementing-sqlite3-busy-timeout-in-an-ios-app

在当前代码中,我使用 CppSQLite3.cpp方法execQuery (const char* szSQL) 来执行 SQL 查询。

请指教。

4

2 回答 2

1

首先,您应该知道 SQLite 执行数据库级别的锁定。当您启动事务并且其他应用程序尝试将某些内容写入同一个数据库时,您会得到并且 SQLite 会在间隔Database is locked后自动尝试执行相同的查询。sqlite3_busy_timeout

所以诀窍是确保您的交易尽可能短,即
1. 开始交易
2. 更新/删除/插入
3. 提交

并且在这 3 个步骤之间没有其他任何内容。并且还sqlite3_busy_timeout根据您的交易量增加您的间隔以适应您的应用程序。

您可以尝试WAL模式,在这种模式下,可以同时完成对 SQLite 的读取和写入。但它也有其自身的一系列缺点。您可以参考 SQLite文档

于 2012-08-07T05:34:35.020 回答
0

SQLite 对多用户和多事务有一些限制。这意味着您无法读取/写入来自不同事务的资源。更新数据库时,数据库将被锁定。

以下是一些可能对您有所帮助的链接


http://sqlite.org/c3ref/busy_timeout.html


http://www.sqlite.org/c3ref/busy_handler.html

祝你好运

于 2012-08-06T19:59:23.157 回答