SQLite 中的 Qt 多线程事务

Qt multithreaded transactions in SQLite

如何使用 SQLite through QSqlDatabase 访问交易?

我打开数据库如下:

m_db = QSqlDatabase::addDatabase("QSQLITE", connection_name);
m_db.setDatabaseName(db_name);
m_db.open();

我为我的读取和写入线程创建了两个这样的连接。 问题是我要写入大量数据流,因此我必须至少在写入线程中使用开始和提交事务。 写入线程运行良好,但在写入线程关闭其连接之前我无法发出任何 select 请求。 以下是我如何使用交易:

m_db.transaction(); // BEGIN TRANSACTION

// Many QSqlRequest-s like so:
QString insert = "INSERT INTO mytable (x, y, z) VALUES (:x, :y, :z);"
QSqlQuery query(m_db);
bool ok = query.prepare(insert);
if (ok)
{
    query.addBindValue(x);
    query.addBindValue(y);
    query.addBindValue(z);
    //...
    if (query.exec())
    {
        // ok
    }
    else
    {
        // show error
    }
}
else
{
    // show error
}

m_db.commit(); // COMMIT TRANSACTION

这是一个常见的用法。 问题是这些标准操作不支持多线程使用。 如何访问正常的多线程事务?QSqlDatabase 默认支持线程,我可以read/write在两个线程中不使用事务,但是事务是必需的。 如何使用 QSqlDatabase 和 SQLite 设置所有常用的多线程选项?

我可以调用 q.exec("BEGIN IMMEDIATE TRANSACTION"); ,但是在两个线程中使用时 returns 出错:database is locked Unable to fetch row.

链接:
"Database is locked" error in SQLite3 with Qt
Why does SQLite give a "database is locked" for a second query in a transaction when using Perl's DBD::SQLite?

这是一个FAQ。 SQLite 没有太多的并发支持。

要同时允许一个作者和读者,请使用WAL mode