如何通过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模式。