1

如何通过QSqlDatabase使用SQLite访问事务?

我打开数据库如下:

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

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

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默认支持线程,我可以在没有事务的情况下在两个线程中读/写,但是事务是必须的。如何使用 QSqlDatabase 和 SQLite 设置所有常用的多线程选项?

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

链接:
使用 Qt 的 SQLite3 中出现“数据库已锁定”错误
为什么在使用 Perl 的 DBD::SQLite 时,SQLite 会为事务中的第二个查询提供“数据库已锁定”?

4

1 回答 1

2

这是一个常见问题解答。SQLite 没有太多的并发支持。

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

于 2017-11-30T17:39:21.370 回答