Z SQLite FAQ wiem, że:
Wiele procesów może mieć tę samą bazę danych otwartą w tym samym czasie.
SELECT
Jednocześ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
CREATE
lubDROP
tabeli lub indeksu podczas gdySELECT
stwierdzenie jest nadal w toku.- Próba zapisu do tabeli, gdy a
SELECT
jest aktywny na tym samym stole.- Próba zrobienia dwóch
SELECT
na 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.
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?