sqlite数据库锁多线程问题

时间:2019-03-20 19:42:59

标签: multithreading gcc sqlite

尽管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。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

SQLITE_BUSY是同时读取和修改数据库时的预期错误代码。如果只有一名作家和许多读者,使用Write-Ahead Logging,可能会大大减少出现的次数。

如果您已禁用自动提交模式(例如,使用sqlite3_exec命令),则

BEGIN在完成后可能会锁定。在这种情况下,您必须发出COMMITROLLBACK命令来释放锁定。

您可以使用sqlite3_busy_timeout安装一个购买处理程序,该处理程序将在SQLite本身内部执行等待。