Kann ich von mehreren Verbindungen gleichzeitig in eine SQLite-Datenbank lesen und schreiben?

87

Ich habe eine SQLite-Datenbank, die von zwei Prozessen verwendet wird. Ich frage mich, ob mit der neuesten Version von SQLite, während ein Prozess (Verbindung) eine Transaktion zum Schreiben in die Datenbank startet, der andere Prozess gleichzeitig aus der Datenbank lesen kann.

sean717
quelle
verwandte Frage siehe hier .. stackoverflow.com/questions/12117016/…
AndroidGeek

Antworten:

142

Ich habe Informationen aus verschiedenen Quellen gesammelt, hauptsächlich von sqlite.org, und sie zusammengestellt:

Erstens können standardmäßig für mehrere Prozesse dieselbe SQLite-Datenbank gleichzeitig geöffnet sein, und mehrere Lesezugriffe können parallel ausgeführt werden.

Beim Schreiben sperrt ein einzelner Schreibvorgang in die Datenbank die Datenbank für kurze Zeit. Nichts, selbst das Lesen, kann überhaupt auf die Datenbankdatei zugreifen.

Ab Version 3.7.0 steht eine neue WAL- Option (Write Ahead Logging) zur Verfügung, mit der das Lesen und Schreiben gleichzeitig fortgesetzt werden kann.

Standardmäßig ist WAL nicht aktiviert. Informationen zum Aktivieren von WAL finden Sie in der SQLite-Dokumentation.

sean717
quelle
Wenn Sie also hypothetisch ein Problem lösen mussten, bei dem Daten lokal gewünscht wurden, ohne sie für die breite Öffentlichkeit zugänglich zu machen, aber mehrere Dateien gleichzeitig schreiben können, benötigen Sie eine Datenbankdatei pro Schreibvorgang, damit mehrere Schreibvorgänge gleichzeitig ausgeführt werden können. ist es? Ich weiß, dass mehrere Dateien normalerweise verpönt sind, aber ich versuche herauszufinden, wie ich mehrere Schreibvorgänge aus einer Sellerie-Aufgabe ausführen kann, ohne eine serverseitige Datenbank zu verwenden, da ich die Daten nur für lokale Berechnungen
benötige
Es gibt ein Pragma, locking_mode = exklusiv , mit dem die Datenbank für einen einzelnen Prozess gesperrt werden kann, wenn Sie diese Funktionalität verhindern möchten.
Scovetta
20

SQLite3 erlaubt explizit mehrere Verbindungen :

(5) Können mehrere Anwendungen oder mehrere Instanzen derselben Anwendung gleichzeitig auf eine einzelne Datenbankdatei zugreifen?

Bei mehreren Prozessen kann dieselbe Datenbank gleichzeitig geöffnet sein. Mehrere Prozesse können gleichzeitig SELECT ausführen. Es kann jedoch zu jedem Zeitpunkt nur ein Prozess Änderungen an der Datenbank vornehmen.

Verwenden Sie zum Freigeben von Verbindungen den gemeinsam genutzten SQLite3-Cache :

Ab Version 3.3.0 enthält SQLite einen speziellen "Shared-Cache" -Modus ( standardmäßig deaktiviert ).

In Version 3.5.0 wurde der Shared-Cache-Modus so geändert, dass derselbe Cache für einen gesamten Prozess und nicht nur für einen einzelnen Thread freigegeben werden kann.

5.0 Aktivieren des Shared-Cache-Modus

Der Shared-Cache-Modus wird pro Prozess aktiviert. Über die C-Schnittstelle kann die folgende API verwendet werden, um den Shared-Cache-Modus global zu aktivieren oder zu deaktivieren:

int sqlite3_enable_shared_cache (int);

Jeder Aufruf von sqlite3_enable_shared_cache () wirkt sich auf nachfolgende Datenbankverbindungen aus, die mit sqlite3_open (), sqlite3_open16 () oder sqlite3_open_v2 () erstellt wurden. Bereits vorhandene Datenbankverbindungen sind nicht betroffen. Jeder Aufruf von sqlite3_enable_shared_cache () überschreibt alle vorherigen Aufrufe innerhalb desselben Prozesses.

Arun
quelle