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?
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. –