Wie verhindere ich SQLite-Datenbanksperren?

10

Aus den SQLite-FAQ habe ich Folgendes gewusst:

Bei mehreren Prozessen kann dieselbe Datenbank gleichzeitig geöffnet sein. Es können mehrere Prozesse SELECTgleichzeitig ausgeführt werden. Es kann jedoch zu jedem Zeitpunkt nur ein Prozess Änderungen an der Datenbank vornehmen.

Also, soweit ich das verstehe ich kann: 1) lesen db von mehreren Threads ( SELECT) 2) lesen db von mehreren Threads ( SELECT) und Schreiben von einzelnen Thread ( CREATE, INSERT, DELETE)

Ich habe jedoch über Write-Ahead-Protokollierung gelesen , die mehr Parallelität bietet, da Leser keine Schreiber blockieren und ein Schreiber keine Leser blockiert . Lesen und Schreiben können gleichzeitig erfolgen.

Schließlich bin ich völlig durcheinander, als ich es gefunden habe , wenn angegeben:

Hier sind andere Gründe, um einen SQLITE_LOCKED-Fehler zu erhalten:

  • Der Versuch, CREATEoder DROPeine Tabelle oder ein Index , während eine SELECTErklärung noch aussteht.
  • Der Versuch, in eine Tabelle zu schreiben, während a SELECTin derselben Tabelle aktiv ist.
  • Versuchen Sie, SELECTin einer Multithread-Anwendung zwei gleichzeitig für dieselbe Tabelle auszuführen, wenn SQLite nicht dafür festgelegt ist.
  • fcntl (3, F_SETLK-Aufruf für DB-Datei schlägt fehl. Dies kann beispielsweise durch ein NFS-Sperrproblem verursacht werden. Eine Lösung für dieses Problem besteht darin, die DB zu entfernen und sie zurück zu kopieren, damit sie einen neuen Inode-Wert hat

Also, ich möchte für mich selbst klarstellen, ist es notwendig, die Sperre zu vermeiden? Kann ich gleichzeitig aus zwei verschiedenen Threads lesen und schreiben? Vielen Dank.

Andrei Orlov
quelle

Antworten:

8

Diese Seite, die Sie verlinkt haben, ist nicht nur ziemlich alt, sondern spricht auch von Zugriffen aus demselben Prozess über dieselbe Datenbankverbindung (oder über Multipe-Verbindungen im gemeinsam genutzten Cache-Modus , die Sie nicht verwenden sollten).

Wenn Sie sich nicht im WAL-Modus befinden, können mehrere Verbindungen aus derselben Datenbank lesen, eine Schreibtransaktion ist jedoch exklusiv, dh es sind keine anderen Leser oder Schreiber zulässig.

Im WAL-Modus blockieren sich ein Schreiber und ein Leser nicht gegenseitig, es ist jedoch immer noch nur ein Schreiber zulässig.

CL.
quelle
1
Was ist falsch am Shared Cache-Modus? Ich konnte mehrere Python-Threads im selben Prozess dazu bringen, über eine joblb Parallel for-Schleife in eine Tabelle damit zu schreiben . Ich hatte Sperrprobleme bis zu einem Satz isolation_level=None. Wie kann ich ohne den gemeinsam genutzten Cache-Modus Instanzen zwischen Threads freigeben?
Justin Dearing
1
Die Dokumentation beschreibt die Nachteile. Es ist besonders gefährlich, wenn Sie nicht wissen, wie Sie Deadlocks vermeiden können.
CL.
Ich komme sehr spät zur Party, aber dieser Link ist nützlich. manski.net/2012/10/sqlite-performance
Infocyde