Zajmuję się programowaniem baz danych za pomocą Java z SQLite.
Przekonałem się, że tylko jedno połączenie z bazą danych ma możliwość zapisu, podczas gdy wiele połączeń jednocześnie ma możliwość odczytu.
Dlaczego architektura SQLite została zaprojektowana w ten sposób? Tak długo, jak dwie rzeczy, które są zapisywane, nie są zapisywane w tym samym miejscu w bazie danych, dlaczego dwa zapisy nie mogą wystąpić jednocześnie?
database
concurrency
sqlite
Stalowy palec
źródło
źródło
Odpowiedzi:
Ponieważ „wielokrotne równoczesne zapisy” są o wiele, znacznie trudniejsze do osiągnięcia w silniku bazowym niż w przypadku pojedynczego zapisu i wielokrotnego odczytu. To wykracza poza parametry projektowe SQLite, a jego włączenie prawdopodobnie podważyłoby uroczo mały rozmiar i prostotę SQLite.
Wspieranie wysokiego stopnia współbieżności zapisu jest cechą charakterystyczną dużych silników baz danych, takich jak DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL i Sybase. Jest to jednak technicznie trudne do osiągnięcia, wymagając rozległej strategii kontroli i optymalizacji współbieżności, takiej jak blokowanie bazy danych, tabel i wierszy lub, w bardziej nowoczesnych implementacjach, kontroli współbieżności w wielu wersjach . Badanie tego problemu / wymagania jest obszerne i sięga dziesięcioleci .
SQLite ma zupełnie inną filozofię projektowania niż większość tych skoncentrowanych na serwerze DBMS, które obsługują wielu pisarzy. Został zaprojektowany, aby zapewnić moc SQL i modelu relacyjnego poszczególnym aplikacjom, a także być wbudowany w każdą aplikację. Ten cel wymaga znacznych kompromisów. Jednym z nich jest brak dodawania znacznej infrastruktury i kosztów ogólnych niezbędnych do obsługi wielu współbieżnych pisarzy.
Filozofię można streścić w instrukcji na odpowiedniej stronie SQLite :
źródło
fopen()
, więc weź pod uwagę cały włochaty charakter, jaki towarzyszy jednoczesnemu zapisywaniu do zwykłego pliku tekstowego.Ponieważ nie ma serwera, który mógłby stwierdzić, czy rzeczy mają być zapisane w tym samym miejscu, czy nie. Istnieją tylko dwa procesy próbujące zapisać do pliku.
Jak wskazano w komentarzu, jednoczesne zapisy mogą być również obsługiwane przez wewnętrzny wątek. Nie jestem pewien, jak dobrze to zadziała (też nie myślałem o tym zbyt wiele). Tak czy inaczej, dlaczego SQLite nie używa wątków: Dr Hipp uważa, że wątki są złe.
Fakt, że DR Hipp uważa, że wątki są złe, jest udokumentowany w FAQ SQLite .
źródło