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
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?
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.
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: Ссылка
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.
Tags und Links python concurrency sqlite3