2009-06-17 11 views
37

Sprawdzam SQLite jako mechanizm przechowywania i jestem ciekawy, czy SQLite blokuje plik bazy danych podczas odczytu.Czy SQLite blokuje plik bazy danych podczas czytania?

Jestem zaniepokojony wydajnością odczytu, ponieważ mój planowany projekt będzie miał kilka zapisów, ale wiele czyta. Jeśli baza danych blokuje się, czy istnieją środki, które można podjąć (takie jak buforowanie pamięci) w celu złagodzenia tego?

Odpowiedz

42

od jego Wikipedia page:

kilka procesów lub wątków komputerowe mogą uzyskać dostęp do tej samej bazy danych bez problemów. Kilka odczytów dostępu można spełnić równolegle.

Dokładniej, z jego FAQ:

wiele procesów może mieć taką samą bazę otwarty w tym samym czasie. Wiele procesów może wykonywać SELECT w tym samym czasie. Jednak tylko jeden proces może wprowadzać zmiany w bazie danych w dowolnym momencie.

Pojedynczy zapis do bazy danych, jednak, robi zablokować bazę danych przez krótki czas, więc nic nie można do niego dostęp w ogóle (nawet nie czyta). Szczegóły można znaleźć w File Locking And Concurrency In SQLite Version 3. Zasadniczo czytanie bazy danych nie stanowi problemu, chyba że ktoś chce natychmiast napisać do bazy danych. W takim przypadku blokada jest blokowana wyłącznie na czas potrzebny do wykonania tej transakcji, a blokada jest następnie zwalniana. Jednak szczegółowe informacje na temat tego, co dokładnie dzieje się z operacjami odczytu na bazie danych w czasie blokady PENDING lub EXCLUSIVE, są ograniczone. Domyślam się, że albo zwracają SQLITE_BUSY albo blokują, dopóki nie będą w stanie czytać. W pierwszym przypadku nie powinno być zbyt trudno po prostu spróbować ponownie, zwłaszcza jeśli spodziewasz się kilku zapisów.

38

Możesz uniknąć blokad podczas czytania, jeśli ustawiłeś tryb dziennika bazy danych na Zapisywanie z wyprzedzeniem (patrz: http://www.sqlite.org/wal.html).

+4

To jest lepsza od zaakceptowanej odpowiedzi, która została napisana, zanim tryb WAL był dostępny. – Stretch

Powiązane problemy