Gleichzeitiges Schreiben mit sqlite3 [duplizieren]

7

Ich verwende das sqlite3 python-Modul, um die Ergebnisse von Batch-Jobs in eine gemeinsame .db -Datei zu schreiben. Ich habe mich für SQLite entschieden, weil mehrere Prozesse versuchen könnten, gleichzeitig zu schreiben, und so wie ich es verstehe, sollte SQLite dies gut bewältigen. Ich bin mir nicht sicher, was passiert, wenn mehrere Prozesse abgeschlossen sind und gleichzeitig versuchen, zu schreiben. Also wenn mehrere Prozesse so aussehen

%Vor%

sofort ausführen, werden sie eine Ausnahme auslösen? Warte höflich auf die anderen Prozesse schreiben? Gibt es einen besseren Weg dies zu tun?

    
Shep 13.08.2013, 10:52
quelle

3 Antworten

17

Die sqlite -Bibliothek sperrt die Datenbank pro Prozess beim Schreiben in die Datenbank und jeder Prozess wartet auf die Freigabe der Sperre, um an die Reihe zu kommen.

Die Datenbank muss jedoch nicht bis commit Zeit geschrieben werden. Sie verwenden die Verbindung als Kontextmanager (gut!), So dass das Commit stattfindet, nachdem Ihre Schleife abgeschlossen wurde und alle insert -Anweisungen ausgeführt wurden.

Wenn in Ihrer Datenbank Eindeutigkeitseinschränkungen vorhanden sind, schlägt möglicherweise das Commit fehl, da ein Prozess bereits Zeilen hinzugefügt hat, mit denen ein anderer Prozess in Konflikt steht.

    
Martijn Pieters 13.08.2013, 10:57
quelle
4

Wenn jeder Prozess seine eigene Verbindung hält, sollte es in Ordnung sein. Was passiert, ist, dass beim Schreiben des Prozesses die DB gesperrt wird, also wird jeder andere Prozess blockieren. Sie werden eine Ausnahme auslösen, wenn das Zeitlimit überschritten wird zu warten, bis die DB frei ist, wird überschritten. Das Timeout kann über den Verbindungsaufruf konfiguriert werden:

Ссылка

Es wird nicht empfohlen, dass Sie Ihre DB-Datei in einer Netzwerkfreigabe haben.

Aktualisierung:

Sie sollten auch die Isolationsstufe überprüfen: Ссылка

    
kursancew 13.08.2013 10:57
quelle
0

Die gute Nachricht ist, dass die SQLLite-Bibliothek implizit eine Transaktion verwendet, die eine Datenbank bei der Ausführung einer DML sperrt. Dies bedeutet, dass andere gleichzeitige Zugriffe auf die Datenbank warten, bis die ausführende DML-Anforderung abgeschlossen ist, indem eine Transaktion ausgeführt / zurückgerollt wird. Beachten Sie jedoch, dass mehrere Prozesse SELECT gleichzeitig ausführen können.

Siehe auch das Python SQL Lite 3.0-Modul im Abschnitt 11.13.6 - Steuern von Transaktionen , die Details darüber enthalten, wie Transaktionen gesteuert werden können.

    
Prahalad Deshpande 13.08.2013 11:27
quelle

Tags und Links