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?
如何使用 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?