Многопоточные транзакции Qt в SQLite
Как получить доступ к транзакциям с использованием SQLite через QSqlDatabase?
Я открываю базу данных следующим образом:
m_db = QSqlDatabase::addDatabase("QSQLITE", connection_name);
m_db.setDatabaseName(db_name);
m_db.open();
Я создаю два таких соединения - для моих тем чтения и записи. Проблема в том, что у меня большой поток данных для записи, поэтому я должен использовать транзакции begin и commit по крайней мере в потоке Write. Запись потока работает хорошо, но я не могу сделать какой-либо запрос на выборку, пока запись потока не закрыл свое соединение. Вот как я использую транзакции:
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?
1 ответ
Это часто задаваемые вопросы. SQLite не имеет большой поддержки параллелизма.
Чтобы разрешить одному писателю и читателю одновременно использовать режим WAL.