2016-04-01 9 views
0

Ich habe mehrere Prozesse (C++, Windows 8), die die gleiche SQLite-Datenbank verwenden. Ich konfigurierte Verbindungen mit SQLITE_CONFIG_SERIALIZED und PRAGMA busy_timeout = 60000;. Benutzter Journalmodus - DELETE.Zugriff auf SQLite-Datenbank aus mehreren Prozessen und SQLITE_BUSY

Testszenario:

  • Prozess # 1 Verbindung öffnet, macht liest/schreibt, für 5 Sekunden
  • Prozess 2 # Verbindung öffnet,/macht liest schreibt

Nach diesem Prozess # 1 konnte nicht in die Datenbank schreiben - er erhält sofort nach dem Aufruf der SQLite-API SQLITE_BUSY (sqlite3_step, sqlite3_finalize). Prozess Nr. 2 verwendet die Verbindung weiterhin ohne Probleme.

Ich habe keine geschlossenen Transaktionen, ich habe keine langen Operationen auf der Datenbank. Was kann sonst noch dazu führen?

Ich verwende die gleiche SQLite-Verbindung von den mehreren Threads innerhalb des Prozesses. Die SQLite-Dokumentation sagt, dass dies mit der Konfigurationsoption SQLITE_CONFIG_SERIALIZED OK ist. Eine Ausnahme für diese Regel?

+0

ich über die Nützlichkeit von 'SQLITE_CONFIG_SERIALIZED' bin nicht sicher; es scheint mir, dass damit die Threads, die die Datenbank teilen, über die Transaktionen des jeweils anderen stapfen. Normalerweise ist es so, dass jeder Thread seine eigene Verbindung erhält, die eine klarere Semantik hat. –

Antwort

0

SQLite erwirbt Sperre für Datenbank/Tabelle in sqlite3_prepare und gibt es in sqlite3_finalize frei. Der Sperrentyp hängt von Ihrem SQL-Ausdruck ab.

Wenn Sie ein STMT erstellt haben, müssen Sie es ausführen und so bald wie möglich abschließen. Sonst blockierst du verschiedene Verbindungen.

Meine Anwendungen erstellt Liste von vorbereiteten STMT und hielt es bis zum Ende. Im Allgemeinen ist dies ein Missbrauch von SQLite.

Links:

Verwandte Themen