Многопоточные транзакции 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.

Другие вопросы по тегам