在我的C ++应用程序中,使用SQLite 3.8.11 API我有多个线程从同一个SQLite数据库读取。每个线程都使用SQLITE_OPEN_READONLY打开数据库。据我所知,SQLite文档,包括这个页面:
http://www.sqlite.org/lockingv3.html
只要没有发生写入操作,我就能从多个线程读取数据库(SHARED锁定)。
我仍然一直从sqlite3_prepare_v2语句中得到SQLITE_BUSY结果......
我已经检查了类似于此问题的堆栈溢出的其他主题,但在所有这些情况下,至少有一个编写器线程。我只有读者线程。
我错过了什么? :)
编辑:这是打开数据库的代码
if(sqlite3_open_v2(filename.c_str(), &_db, sqlite_flags, NULL) != SQLITE_OK)
{
if(_log) _log->ErrorFormat(L"Failed to open SQLite database %hs, error = %hs", filename.c_str(), sqlite3_errmsg(_db));
return false;
}
我已在调试器中验证sqlite_flags变量设置为SQLITE_OPEN_READONLY
我还验证了SQLite库是使用线程支持编译的,sqlite3_threadsafe()调用返回1,这应该是序列化模式。据我了解,这是多线程最安全的模式。