如何通过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 会为事务中的第二个查询提供“数据库已锁定”?