尽管sqlite已使用-DSQLITE_THREADSAFE = 2进行了编译,但我仍然遇到了“数据库锁定”问题,并且每个线程都使用自己的数据库连接,例如以下简化代码:
thread *t = new thread(RandomTextThread);
t.join();
和
static void RandomTextThread(void * aArg)
{
RandomText *rt1;
rt1 = new RandomText();
rt1->genRandomText();
}
和
RandomText::RandomText() {
int rc;
//
// open the database
//
rc = sqlite3_open("mydata.db.sqlite", &this->db);
}
因此,在由RandomTextThread静态函数构造的每个线程中,将创建一个新的RandomText对象,该对象又创建一个存储在-> db类变量中的新的sqlite连接。
有时代码将执行DML命令。这适用于一个线程而没有错误。 但是,由上述机制创建的两个或多个线程将失败,直到将这些线程立即变为并发DML。
系统很旧,我可以编译sqlite 3.27,但是我只能将GCC 4.2与TinyThread ++解决方案一起使用,而TinyThread ++解决方案又使用POSIX pthread.h。 任何帮助表示赞赏。
答案 0 :(得分:0)
SQLITE_BUSY
是同时读取和修改数据库时的预期错误代码。如果只有一名作家和许多读者,使用Write-Ahead Logging,可能会大大减少出现的次数。
sqlite3_exec
命令),则 BEGIN
在完成后可能会锁定。在这种情况下,您必须发出COMMIT
或ROLLBACK
命令来释放锁定。
您可以使用sqlite3_busy_timeout
安装一个购买处理程序,该处理程序将在SQLite本身内部执行等待。