Próbuję określić, czy mój dostęp do bazy danych sqlite jest bezpieczny dla wątków w systemie iOS. Piszę aplikację inną niż App Store (lub prawdopodobnie demon uruchamiania), więc zatwierdzenie Apple nie stanowi problemu. Wspomniana baza danych to wbudowany sms.db, więc z pewnością system operacyjny również uzyskuje dostęp do tej bazy danych do odczytu i zapisu. Chcę tylko móc to bezpiecznie przeczytać.Interprocess SQLite Bezpieczeństwo wątków (w systemie iOS)
Czytałem this about reading from multiple processes with sqlite:
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 w czasie .
Rozumiem, że bezpieczeństwo wątków może zostać skompilowane z sqlite, a do testowania można użyć testu sqlite3_threadsafe()
. Bieganie to na iOS 5.0.1
int safe = sqlite3_threadsafe();
daje wynik 2. According to this, że środki blokujące mutex jest dostępny. Ale to niekoniecznie oznacza, że jest w użyciu.
Nie jestem całkiem pewien, czy bezpieczeństwo wątków jest dynamicznie włączane w odniesieniu do jednego połączenia, bazy danych czy globalnej.
I have also read this. Wygląda na to, że można użyć sqlite3_config()
, aby umożliwić bezpieczne wielowątkowość, ale oczywiście nie mam żadnej kontroli, ani widoczności, w jaki sposób system operacyjny mógł użyć tego połączenia (czy ja?). Gdybym miał wykonać to wezwanie ponownie w mojej aplikacji, czy pozwoliłoby to na bezpieczne odczytanie bazy danych, czy też spowodowałoby jedynie dekonflikację równoczesnego dostępu dla wielu wątków w mojej aplikacji, która używała tego samego handle bazy danych sqlite3
?
W każdym razie, moje pytanie brzmi ...
mogę spokojnie czytać tę bazę danych, która jest również uzyskać przez iOS, a jeśli tak, to w jaki sposób?
Kiedy mówisz "* nadal powinno się, powiedzmy, wziąć blokadę EXCLUSIVE przed napisaniem *", masz na myśli, że SQLite automatycznie zrobi to dla mnie? Lub że ja (lub framework SMS iOS) jestem za to odpowiedzialny? Na przykład, czy muszę (lub iOS) wydać instrukcję "BEGIN EXCLUSIVE TRANSACTION;" przed napisaniem? – Nate
Dodałem zmianę. "BEGIN EXCLUSIVE TRANSACTION" służy do wykonania blokady EXCLUSIVE na początku transakcji. Domyślnie SQLite czeka tak długo, jak może. Z dokumentacji: * Zauważ, że polecenie BEGIN nie pozyskuje żadnych blokad w bazie danych. Po poleceniu BEGIN blokada SHARED zostanie uzyskana po wykonaniu pierwszej instrukcji SELECT. Blokada RESERVED zostanie uzyskana po wykonaniu pierwszej instrukcji INSERT, UPDATE lub DELETE. * ... –
... * Nie blokuje się blokady EXCLUSIVE dopóki pamięć podręczna w pamięci nie zapełni się i musi zostać rozlana na dysk lub do momentu transakcji popełnia. W ten sposób system opóźnia blokowanie dostępu do odczytu do pliku pliku do ostatniej możliwej chwili. * Nawet, jeśli nie używasz opcji "BEGIN TRANSACTION", wszystkie instrukcje są nadal w transakcji niejawnej. –