我使用的是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查询。
请建议。
答案 0 :(得分:0)
SQLite对多个用户和多个事务有一些限制。这意味着您无法从不同的事务中读取/写入资源。在更新数据库时,数据库将被锁定。
以下是一些可能对您有帮助的链接
http://sqlite.org/c3ref/busy_timeout.html
http://www.sqlite.org/c3ref/busy_handler.html
祝你好运
答案 1 :(得分:0)
首先,您应该知道SQLite执行数据库级锁定。当您启动事务而另一个应用程序尝试将某些内容写入同一个数据库时,您将获得Database is locked
并且SQLite会在sqlite3_busy_timeout
间隔后自动尝试执行相同的查询。
所以诀窍是确保你的交易尽可能短,即
1.做一个开始交易
2.更新/删除/插入
3.承诺
这三个步骤之间没有任何其他内容。
并且还会增加sqlite3_busy_timeout
间隔以适应您的应用程序,具体取决于您的交易量。
您可以尝试WAL
模式,可以同时读取和写入SQLite。但它带来了一系列的缺点。您可以参考SQLite documentation。