Używam modułu python sqlite3
do zapisywania wyników z zadań wsadowych do wspólnego pliku .db
. Wybrałem SQLite, ponieważ wiele procesów może próbować pisać w tym samym czasie, a jak rozumiem, SQLite powinien to dobrze. Nie jestem pewien, co się stanie, gdy wiele procesów się zakończy i spróbuję pisać w tym samym czasie. Jeśli więc kilka procesów, które wyglądają tak, jak te, wykonywane na raz, będą wywoływać wyjątek? Zaczekaj grzecznie, aby inne procesy zostały napisane? Czy jest jakiś lepszy sposób na zrobienie tego?Równoczesne pisanie z sqlite3
Odpowiedz
Biblioteka sqlite
zablokuje bazę danych dla procesu podczas zapisywania do bazy danych, a każdy proces będzie czekać na zwolnienie blokady, aby uzyskać swoją kolej.
Baza danych nie musi być zapisana, dopóki nie zostanie zatwierdzony . Używasz połączenia jako menedżera kontekstu (dobrze!), Więc zatwierdzenie ma miejsce po zakończeniu pętli i wykonaniu wszystkich instrukcji insert
.
Jeśli baza danych zawiera ograniczenia unikalności, może się zdarzyć, że zatwierdzenie nie powiedzie się, ponieważ jeden proces już dodał wiersze, z którymi inny proces jest w konflikcie.
, więc czy blokada jest włączona przy 'connect' lub po zatwierdzeniu? – Shep
Blokada jest chwytana podczas pisania. –
@MartijnPieters ... a blokada jest zwalniana po powrocie z wywołania funkcji commit. Czy ja się mylę? –
Jeśli każdy proces ma własne połączenie, powinno być w porządku. Co się stanie, to, że podczas pisania procesu zablokujesz DB, , więc wszystkie inne procesy zostaną zablokowane. Wyrzucą wyjątek, jeśli przekroczony zostanie limit czasu oczekiwania na pobranie DB. Limit czasu może być skonfigurowany przez connect rozmowy:
http://docs.python.org/2/library/sqlite3.html#sqlite3.connect
Nie zaleca się, że masz plik DB w udziale sieciowym.
Aktualizacja:
Można też sprawdzić poziom izolacji: http://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.isolation_level
Dobrą wiadomością jest to, że biblioteka SQLLite niejawnie wykorzystuje transakcję, która blokuje bazę danych, gdy wykonanie DML. Oznacza to, że inne współbieżne dojścia do bazy danych będą czekać do zakończenia wykonywania żądania DML przez zatwierdzenie/wycofanie transakcji. Należy jednak pamiętać, że wiele procesów może wykonywać SELECT w tym samym czasie.
Proszę również zapoznać się z Python SQL Lite 3.0 module w sekcji 11.13.6 - Kontrolowanie transakcji, który szczegółowo opisuje, w jaki sposób można kontrolować transakcje.
- 1. Maksymalne równoczesne połączenia z MySQL
- 2. Równoczesne żądania z MRI Ruby
- 3. Problemy z łączeniem sqlite3
- 4. import sqlite3 z cytatami
- 5. PHP z obsługą sqlite3
- 6. Maksymalne równoczesne połączenia Socket.IO
- 7. Równoczesne odtwarzanie 2 dźwięków
- 8. Kompilacja z sqlite3 w C++
- 9. SQLite jednoczesne czytanie i pisanie
- 10. Równoczesne odczytywanie i zapisywanie gniazd
- 11. Równoczesne wstawianie za pomocą MySQL
- 12. Java: Równoczesne odczyty na InputStream
- 13. Pisanie kropli z SQLite do pliku przy użyciu Pythona
- 14. Równoczesne czytanie/zapisywanie w Haskell?
- 15. Równoczesne czytanie pliku (java preffered)
- 16. Spring Websockets Max Równoczesne połączenia
- 17. Równoczesne korzystanie z wielu menedżerów pakietów z przodu (Bower, NuGet)
- 18. Pisanie sformatowany XML z XmlWriter
- 19. Pisanie dynamiczny CSS z Jade
- 20. Czytanie i pisanie z localStorage?
- 21. Klejnotu sqlite3-ruby nie można znaleźć sqlite3.h na ubuntu
- 22. sqlite3 i cursor.description
- 23. Pozwolenie sqlite3 odmowa Androida
- 24. Uruchom sqlite3 z pythonem w linii poleceń
- 25. Określanie maksymalnej liczby kolumn z sqlite3
- 26. Nie można zainstalować SQLITE3 z JRuby
- 27. Otwieranie SQLite3 jako READONLY z PDO?
- 28. wersja Pythona Sqlite3
- 29. sqlite3: Nie znaleziono
- 30. SQLite3 i wiele procesów
Nie jestem pewien, czy to jest dup: Pytam o zachowanie konkretnego modułu python, a nie SQLite w ogóle. – Shep