2013-08-13 23 views
7

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

+1

Nie jestem pewien, czy to jest dup: Pytam o zachowanie konkretnego modułu python, a nie SQLite w ogóle. – Shep

Odpowiedz

16

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.

+1

, więc czy blokada jest włączona przy 'connect' lub po zatwierdzeniu? – Shep

+1

Blokada jest chwytana podczas pisania. –

+1

@MartijnPieters ... a blokada jest zwalniana po powrocie z wywołania funkcji commit. Czy ja się mylę? –

4

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

0

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.