SQLite中的QT多线程交易



如何通过qsqldatabase使用sqlite访问交易?

我打开数据库如下:

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

我创建了两个这样的连接 - 用于我的读写线程。问题在于我有一个很大的数据流,因此我必须至少在写线程中使用开始和提交交易。写线程效果很好,但是我无法提出任何选择的请求,直到Write Thread Onter Conlus Connection。这是我使用交易的方式:

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

链接:
"数据库已锁定"sqlite3中的错误qt

为什么SQLITE给出"数据库"锁定。对于使用Perl的DBD :: SQLite?

,用于交易中的第二个查询

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

允许一位作家和读者同时使用WAL模式。

最新更新