Wie kann man Zugriff auf Transaktionen mit SQLite bis QSqlDatabase erhalten?Qt Multithread-Transaktionen in SQLite
Ich öffne die Datenbank wie folgt:
m_db = QSqlDatabase::addDatabase("QSQLITE", connection_name);
m_db.setDatabaseName(db_name);
m_db.open();
schaffe ich zwei solche Verbindungen - für meine Lesen und Schreiben Threads. Das Problem ist, dass ich einen großen Datenstrom zu schreiben habe, daher muss ich Begin und Commit-Transaktionen zumindest im Write-Thread verwenden. Write-Thread funktioniert gut, aber ich kann keine Select-Anfrage machen, bis der Write-Thread seine Verbindung beendet hat. Hier ist, wie ich Transaktionen verwenden:
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
Dies ist eine häufige Verwendung. Das Problem ist, dass diese Standardoperationen Multithreading nicht unterstützen. Wie kann ich auf normale Multithreading-Transaktionen zugreifen? QSqlDatabase unterstützt Threads standardmäßig, und ich kann in beiden Threads ohne Transaktionen lesen/schreiben, aber Transaktionen sind notwendig. Wie kann ich alle gängigen Multithreading-Optionen mit QSqlDatabase und SQLite einrichten?
Ich kann q.exec("BEGIN IMMEDIATE TRANSACTION");
aufrufen, aber es gibt einen Fehler bei der Verwendung in beiden Threads: database is locked Unable to fetch row
. Verbindungen
:
"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?