Mam bazę danych SQLite używaną przez dwa procesy. Zastanawiam się, czy przy najnowszej wersji SQLite, podczas gdy jeden proces (połączenie) rozpoczyna transakcję zapisu do bazy danych, czy drugi proces będzie mógł jednocześnie czytać z bazy danych?
Mam bazę danych SQLite używaną przez dwa procesy. Zastanawiam się, czy przy najnowszej wersji SQLite, podczas gdy jeden proces (połączenie) rozpoczyna transakcję zapisu do bazy danych, czy drugi proces będzie mógł jednocześnie czytać z bazy danych?
Odpowiedzi:
Zebrałem informacje z różnych źródeł, głównie z sqlite.org, i złożyłem je razem:
Po pierwsze, domyślnie wiele procesów może mieć otwartą tę samą bazę danych SQLite w tym samym czasie, a kilka dostępów do odczytu może być obsługiwanych równolegle.
W przypadku zapisu, pojedynczy zapis do bazy danych blokuje bazę na krótki czas, nic, nawet odczyt, nie ma dostępu do pliku bazy danych.
Począwszy od wersji 3.7.0, dostępna jest nowa opcja „ Zapisywanie z wyprzedzeniem w dzienniku ” (WAL) , w której odczyt i zapis może odbywać się jednocześnie.
Domyślnie WAL nie jest włączony. Aby włączyć WAL, zapoznaj się z dokumentacją SQLite.
SQLite3 jawnie zezwala na wiele połączeń :
(5) Czy wiele aplikacji lub wiele instancji tej samej aplikacji może mieć dostęp do jednego pliku bazy danych w tym samym czasie?
Wiele procesów może mieć otwartą tę samą bazę danych w tym samym czasie. WYBÓR może wykonywać jednocześnie wiele procesów. Jednak tylko jeden proces może wprowadzać zmiany w bazie danych w dowolnym momencie.
Do udostępniania połączeń użyj udostępnionej pamięci podręcznej SQLite3 :
Począwszy od wersji 3.3.0, SQLite zawiera specjalny tryb „Shared-Cache” ( domyślnie wyłączony )
W wersji 3.5.0 tryb współużytkowanej pamięci podręcznej został zmodyfikowany, aby ta sama pamięć podręczna mogła być współużytkowana w całym procesie, a nie tylko w jednym wątku.
5.0 Włączanie trybu współdzielonej pamięci podręcznej
Tryb współdzielonej pamięci podręcznej jest włączany dla każdego procesu. Korzystając z interfejsu C, można użyć następującego interfejsu API do globalnego włączania lub wyłączania trybu współdzielonej pamięci podręcznej:
int sqlite3_enable_shared_cache (int);
Każde wywołanie sqlite3_enable_shared_cache () wpływa na kolejne połączenia z bazą danych utworzone za pomocą funkcji sqlite3_open (), sqlite3_open16 () lub sqlite3_open_v2 (). Nie ma to wpływu na istniejące już połączenia z bazą danych. Każde wywołanie sqlite3_enable_shared_cache () przesłania wszystkie poprzednie wywołania w ramach tego samego procesu.