2017-11-30 2 views
0

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?

Antwort

1

Dies ist ein FAQ. SQLite unterstützt nicht viel Parallelität.

Verwenden Sie WAL mode, um einen Schreiber und Leser gleichzeitig zu ermöglichen.

Verwandte Themen