Jako częstą przyczynę uszkodzenia plików dokumentacja często podaje jako przyczynę „NFS, który nie implementuje poprawnie blokowania na poziomie plików” lub coś podobnego, np. Dla SQLite:
Jak uszkodzić plik bazy danych SQLite , akapit 2.1
2.1 Systemy plików z uszkodzonymi lub brakującymi implementacjami blokad
SQLite zależy od bazowego systemu plików, aby wykonać blokowanie, tak jak dokumentuje. Ale niektóre systemy plików zawierają błędy w logice blokowania, przez co blokady nie zawsze zachowują się tak, jak reklamowano. Dotyczy to w szczególności sieciowych systemów plików, w szczególności NFS. Jeśli SQLite jest używany w systemie plików, w którym prymitywy blokujące zawierają błędy, i jeśli dwa lub więcej wątków lub procesów próbuje uzyskać dostęp do tej samej bazy danych w tym samym czasie, może to spowodować uszkodzenie bazy danych.
O tym - lub coś w tym rodzaju - często wspominano przez ponad dekadę, zwykle w mieszanych środowiskach Windows / Unix. Jednak nigdy nie znalazłem żadnego wskazania, które sieciowe systemy plików (lub kombinacje klient / serwer) faktycznie są zagrożone.
Co mogę powiedzieć moim klientom?
źródło
Odpowiedzi:
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 .
źródło