Które sieciowe systemy plików nieprawidłowo implementują blokowanie?
Uważam, że poprawna odpowiedź jest w skrócie: „Wszystkie”.
Należy to zakwalifikować do kontekstu wielu procesów na wielu komputerach uzyskujących dostęp do tej samej bazy danych przez sieć. Nie powinno być problemu, gdy wszystkie procesy uzyskujące dostęp do bazy danych działają na tym samym komputerze, jeśli silnik bazy danych (SQLite) używa narzędzi wykluczających, takich jak semafory lub muteks (i używa ich poprawnie ...).
Powodem tego jest to, że informacje o tym, co jest zablokowane, są zwykle przechowywane w kontekście „procesu X blokuje Y”. Może to działać bardzo dobrze, gdy wszystkie procesy są wykonywane na tym samym komputerze, ale niezbyt dobrze, gdy są na różnych komputerach.
Gdy proces z jednego komputera uzyskuje dostęp do pliku na innym komputerze, lokalny system operacyjny sam zastępuje proces zdalny, w efekcie działając jako agent dla procesu, o którym nic nie wie. Może nawet mieć trudności z rozróżnieniem dwóch różnych procesów wykonywanych na tym samym komputerze zdalnym i pomylić jeden z drugim.
Aby poprawnie zablokować pliki, cały plik lub jego część, naprawdę potrzebowałby jednego systemu operacyjnego, który działa na wszystkich zaangażowanych komputerach ze scentralizowanym repozytorium danych do blokowania plików. Niestety, ani Linux, ani Windows nie mogą tego zrobić w ogólnym przypadku.
Lepszy traktat na temat SQLite można znaleźć w sekcji „Jak uszkodzić pliki bazy danych” w starszym artykule
Blokowanie i współbieżność plików w SQLite w wersji 3 . Te szczegóły, które system wywołuje za pomocą SQLite, aby zapewnić współbieżność w systemach Windows i Linux, zarówno w celu blokowania sekcji plików, jak i wypłukiwania zaktualizowanych danych z komputera do bazy danych. Wszystkie wymienione funkcje działałyby dobrze tylko w kontekście jednego komputera. Odpowiednio, ten artykuł zawiera zdanie „Najlepszą obroną jest nie używanie SQLite do plików w sieciowym systemie plików”.
Zauważ, że problem opróżniania danych do bazy danych jest szczególnie niepokojący, ponieważ system operacyjny zwykle opóźnia zapis, więc może się zdarzyć, że proces aktualizacji opróżnił dane i zwolnił blokadę, ale nowe dane mogły jeszcze nie przybyć do bazy danych, gdy inny proces próbował ją odczytać, co kończy się łatwo uszkodzoną bazą danych.
Więcej informacji można znaleźć w artykule SQLite
Atomic Commit In SQLite , w sekcji
Rzeczy, które mogą pójść źle . Dodaje przypadek, w którym różne procesy i komputery mogą korzystać z różnych mechanizmów blokowania, w których jeden nie blokuje drugiego.
W systemach zarządzania bazami danych, które rozwiązały ten problem, takich jak Oracle lub SQL Server, rozwiązaniem jest wyznaczenie jednego konkretnego komputera jako jedynego, który może aktualizować bazę danych, więc blokowanie jest znacznie uproszczone. Inne systemy sieci komputerowych, takie jak
Apache Hadoop,
dostarczają własne mechanizmy blokujące w celu rozwiązania tych problemów.
Innym ciekawym artykułem jest
O łamaniu blokowania plików .