Jak zapobiec blokadom bazy danych SQLite?

11

Z SQLite FAQ wiem, że:

Wiele procesów może mieć tę samą bazę danych otwartą w tym samym czasie. SELECTJednocześnie może być wykonywanych wiele procesów . Jednak tylko jeden proces może wprowadzać zmiany w bazie danych w dowolnym momencie.

Tak więc, o ile rozumiem, mogę: 1) Czytaj db z wielu wątków ( SELECT) 2) Czytaj db z wielu wątków ( SELECT) i zapisu z pojedynczej nici ( CREATE, INSERT, DELETE)

Ale czytałem o zapisywaniu z wyprzedzeniem, które zapewnia większą współbieżność, ponieważ czytelnicy nie blokują pisarzy, a pisarz nie blokuje czytników . Czytanie i pisanie może odbywać się jednocześnie.

W końcu całkowicie się zagubiłem, gdy go znalazłem , gdy określono:

Oto inne powody otrzymania błędu SQLITE_LOCKED:

  • Próbując CREATElub DROPtabeli lub indeksu podczas gdy SELECTstwierdzenie jest nadal w toku.
  • Próba zapisu do tabeli, gdy a SELECTjest aktywny na tym samym stole.
  • Próba zrobienia dwóch SELECTna tym samym stole w tym samym czasie w aplikacji wielowątkowej, jeśli sqlite nie jest na to ustawiony.
  • fcntl (3, F_SETLK wywołanie pliku DB kończy się niepowodzeniem. Może to być spowodowane na przykład problemem z blokowaniem NFS. Jednym z rozwiązań tego problemu jest usunięcie bazy danych DB i skopiowanie jej z powrotem, aby uzyskała nową wartość i-węzła

Chciałbym więc wyjaśnić, że konieczne jest uniknięcie blokady? Czy mogę czytać i pisać jednocześnie z dwóch różnych wątków? Dzięki.

Andrei Orłow
źródło

Odpowiedzi:

9

Strona, którą podłączyłeś, poza tym, że jest dość stara, mówi o dostępach z tego samego procesu za pośrednictwem tego samego połączenia z bazą danych (lub za pośrednictwem połączeń wielopunktowych w trybie współużytkowanej pamięci podręcznej , których nie powinieneś używać).

Gdy nie jest w trybie WAL, wiele połączeń może odczytywać z tej samej bazy danych, ale transakcja zapisu jest wyłączna, tzn. Nie są dozwolone żadne inne czytniki ani zapisujące.

W trybie WAL program piszący i czytniki nie blokują się, ale nadal dozwolony jest tylko jeden program piszący.

CL.
źródło
1
Co jest nie tak z trybem współdzielonej pamięci podręcznej? Byłem w stanie uzyskać wiele wątków Pythona w tym samym procesie, aby zapisywać z nim tabelę za pomocą pętli joblb Parallel for . Miałem jednak problemy z blokowaniem aż do zestawu isolation_level=None. W jaki sposób bez współużytkowania instancji między wątkami bez trybu współużytkowanej pamięci podręcznej?
Justin Dearing,
1
Dokumentacja opisuje wady. Jest to szczególnie niebezpieczne, jeśli nie wiesz, jak uniknąć impasu.
CL.
Przychodzę na imprezę bardzo późno, ale ten link jest przydatny. manski.net/2012/10/sqlite-performance
infocyde