Najpopularniejsze obecnie relacyjne bazy danych obsługują „ACID właściwości – Atomowość, Spójność, Izolacja i Trwałość. Deweloperzy i administratorzy baz danych (DBA) pracujący z relacyjnymi bazami danych dobrze rozumieją zachowanie ACID. Jednak podczas pracy z bazami danych NoSQL, takimi jak chmura MongoDB, istnieje kilka kluczowych różnic, które należy zrozumieć. MongoDB zapewnia dużą elastyczność w zakresie przechowywania, schematu i skalowania, ale rozluźnia niektóre właściwości ACID. Niezbędne jest zrozumienie różnic podczas modelowania danych i wykonywania poleceń MongoDB.
Atomowość
Wikipedia definiuje „Atomowość” w następujący sposób – „W atomowej transakcji , seria operacji na bazie danych albo wszystkie wystąpić lub nic występuje. Gwarancja niepodzielności zapobiega jedynie częściowym aktualizacjom bazy danych, co może powodować większe problemy niż całkowite odrzucenie całej serii. Innymi słowy atomowość oznacza niepodzielność i nieredukowalność”.
Operacje zapisu MongoDB są atomowe, tylko na poziomie pojedynczego dokumentu. Jeśli modyfikujesz wiele dokumentów podrzędnych w dokumencie, operacja jest nadal niepodzielna, ale jeśli modyfikujesz wiele dokumentów, operacja nie jest niepodzielna. Jak więc osiągnąć atomowe zachowanie w wielu dokumentach? Aby osiągnąć pożądaną atomowość, musisz użyć wzorca „zatwierdzania dwufazowego”. Oto świetny przykład z dokumentacji MongoDB, jak zaimplementować ten wzorzec. Wzorzec zatwierdzania dwufazowego nie jest trywialny do zaimplementowania i uzyskania właściwego działania – więc upewnij się, że niejednorodność zapisu wielu dokumentów jest czymś, do czego chcesz strzelać.
Izolacja
Wikipedia definiuje „izolację” w następujący sposób:„W systemach baz danych izolacja to właściwość określająca, w jaki sposób/kiedy zmiany wprowadzone przez jedną operację stają się widoczne dla innych równoczesnych operacji”. Istnieje wiele sposobów na uzyskanie izolacji za pomocą operacji MongoDB, na przykład:
-
Polecenie „findAndModifyOperation()”
Jest to jeden z najprostszych sposobów wyszukiwania i modyfikowania istniejących dokumentów. Polecenie może zwrócić poprzednie wartości dokumentów lub nowe zaktualizowane wartości dokumentów. Możesz także posortować pasujące dokumenty, upsert i wybrać pola, które mają zostać zwrócone:
db.collection.findAndModify( { query: <document>, sort: <document>, remove: <boolean>, update: <document>, new: <boolean>, fields: <document>, upsert: <boolean> } );
-
Wzorzec „Aktualizuj, jeśli jest obecny”
Ten wzorzec jest określony w dokumentacji MongoDB. Wymaga więcej pracy ręcznej, ale daje większą kontrolę.
-
operator $izolacji
Operator $izolacji umożliwia izolowanie zapisów w wielu dokumentach. Jednak operator $izolacji nie daje gwarancji „wszystko albo nic” — aby to osiągnąć, będziesz musiał użyć niektórych technik atomizacji określonych w pierwszej sekcji. Ponadto operator $isolation nie działa w przypadku fragmentów. To polecenie kiedyś nazywało się „$atomic” – teraz zostało poprawnie przemianowane na „$isolated”.
Współbieżność
MongoDB używa blokad, aby uniemożliwić wielu klientom aktualizację tego samego fragmentu danych w tym samym czasie. MongoDB 2.2+ używa blokad na poziomie „bazy danych”. Tak więc, gdy jedna operacja zapisu blokuje bazę danych, wszystkie inne operacje zapisu do tej samej bazy danych (nawet jeśli dotyczą oddzielnej kolekcji) są blokowane w oczekiwaniu na blokadę. MongoDB używa blokad „zachłannych do zapisu”, które faworyzują zapisy zamiast odczytów. W wersji 2.2+ niektóre długotrwałe operacje mogą uwolnić swoje blokady.
Bezpieczeństwo wątków
Nie wszystkie klasy klienta MongoDB są bezpieczne dla wątków — zapoznaj się z dokumentacją konkretnego sterownika, aby sprawdzić, czy klasy, których używasz, są bezpieczne dla wątków. Na przykład w sterowniku Java klasa MongoClient jest bezpieczna wątkowo. Możesz więc użyć jednej instancji tej klasy we wszystkich swoich wątkach. Wewnętrznie MongoClient używa puli połączeń do zarządzania połączeniami z serwerem MongoDB.
Jak zawsze, jeśli masz jakiekolwiek pytania, skontaktuj się z nami pod adresem [email protected].