Nie jestem ekspertem od baz danych i nie mam formalnego zaplecza informatycznego, więc proszę o wyrozumiałość. Chcę poznać rodzaje negatywnych rzeczy w świecie rzeczywistym, które mogą się zdarzyć, jeśli użyjesz starej wersji MongoDB przed wersją v4 , które nie były zgodne z ACID . Dotyczy to każdej bazy danych niezgodnej z ACID.
Rozumiem, że MongoDB może wykonywać Operacje Atomowe , ale nie obsługują „tradycyjnych blokad i złożonych transakcji”, głównie ze względu na wydajność. Rozumiem również znaczenie transakcji w bazie danych i przykład, kiedy twoja baza danych jest dla banku, a aktualizujesz kilka rekordów, z których wszystkie muszą być zsynchronizowane, chcesz, aby transakcja powróciła do stanu początkowego, jeśli istnieje przerwa w zasilaniu, więc kredyt równa się zakupowi itp.
Ale kiedy wchodzę w rozmowy na temat MongoDB, ci z nas, którzy nie znają technicznych szczegółów tego, jak bazy danych są faktycznie wdrażane, zaczynają rzucać się na takie stwierdzenia:
MongoDB jest znacznie szybszy niż MySQL i Postgres, ale istnieje niewielka szansa, na przykład 1 na milion, że „nie zapisze się poprawnie”.
Ta część „nie zapisuje się poprawnie” odnosi się do tego zrozumienia: jeśli w chwili pisania w MongoDB nastąpi przerwa w dostawie prądu, istnieje szansa na określony rekord (powiedzmy, że śledzisz odsłony w dokumentach z 10 atrybutami każdego), że jeden z dokumentów zapisał tylko 5 atrybutów… co z czasem oznacza, że liczniki wyświetleń strony będą „nieznacznie” wyłączone. Nigdy nie dowiesz się o ile, wiesz, że będą one w 99,999% poprawne, ale nie w 100%. Wynika to z faktu, że dopóki nie uczynisz tego konkretnie operacją atomową mongodb , nie ma gwarancji, że operacja ta będzie atomowa.
Więc moje pytanie brzmi: jaka jest prawidłowa interpretacja kiedy i dlaczego MongoDB może nie „poprawnie zapisać”? Jakie części ACID nie spełnia i pod jakimi warunkami i skąd wiesz, kiedy 0,001% twoich danych jest wyłączone? Czy nie da się tego jakoś naprawić? Jeśli nie, oznacza to, że nie powinieneś przechowywać takich rzeczy jak twój users
stół w MongoDB, ponieważ rekord może nie zostać zapisany. Ale z drugiej strony, 1/1 000 000 użytkowników może po prostu „spróbować zarejestrować się ponownie”, nie?
Właśnie szukam być może listy, kiedy / dlaczego zdarzają się negatywne rzeczy z niezgodną bazą danych ACID, taką jak MongoDB, i idealnie, jeśli istnieje standardowe obejście (na przykład uruchomienie zadania w tle w celu oczyszczenia danych lub użycie SQL tylko do tego itp.) .
W rzeczywistości nie jest poprawne, że MongoDB nie jest zgodny z ACID. Przeciwnie, MongoDB jest zgodny z ACID na poziomie dokumentu .
Każda aktualizacja jednego dokumentu to
MongoDB nie ma transakcji - to znaczy aktualizacji wielu dokumentów, które można wycofać i są zgodne z ACID.
Zauważ, że możesz budować transakcje na podstawie aktualizacji zgodnych z ACID do jednego dokumentu, używając zatwierdzania dwufazowego .
źródło
Dobre wyjaśnienie znajduje się w „Starbucks nie używa zatwierdzania dwufazowego” .
Nie chodzi o bazy danych NoSQL, ale ilustruje to, że czasami możesz sobie pozwolić na utratę transakcji lub tymczasową niespójność bazy danych.
Nie uważałbym tego za coś, co należy „naprawić”. Rozwiązaniem jest użycie relacyjnej bazy danych zgodnej z ACID. Wybierasz alternatywę NoSQL, gdy jej zachowanie spełnia wymagania twojej aplikacji.
źródło
Myślę, że inni ludzie już dawali dobre odpowiedzi. Jednak chciałbym dodać, że istnieją ACID NoSQL DB (jak http://ravendb.net/ ). Więc to nie tylko decyzja NOSQL - brak ACID vs. Relacyjny z ACID ....
źródło
„nie zapisuje się poprawnie” może oznaczać:
Domyślnie MongoDB nie zapisuje natychmiast twoich zmian na dysku. Istnieje więc możliwość, że powiesz użytkownikowi, że „aktualizacja się powiodła”, nastąpi przerwa w dostawie prądu i aktualizacja zostanie utracona. MongoDB zapewnia opcje kontroli poziomu „trwałości” aktualizacji. Może poczekać, aż inne repliki otrzymają tę aktualizację (w pamięci), poczekać na zapis do pliku dziennika lokalnego itp.
Nie ma łatwych „atomowych” aktualizacji wielu kolekcji, a nawet wielu dokumentów w tej samej kolekcji. W większości przypadków nie stanowi to problemu, ponieważ można go obejść za pomocą funkcji zatwierdzania dwufazowego lub restrukturyzacji schematu, aby aktualizacje były wprowadzane w jednym dokumencie. Zobacz to pytanie: Bazy danych dokumentów: Nadmiarowe dane, referencje itp. (W szczególności MongoDB)
źródło
Począwszy od wersji MongoDB v4.0, obsługiwane będą wielodokumentowe transakcje ACID. Dzięki izolacji migawek transakcje zapewnią globalnie spójny widok danych i wymuszą wykonanie wszystkiego lub nic, aby zachować integralność danych.
Czują się jak transakcje ze świata relacyjnego, np .:
Zobacz https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb
źródło
Proszę przeczytać o właściwościach ACID, aby uzyskać lepsze zrozumienie.
Również w dokumentacji MongoDB można znaleźć pytanie i odpowiedź .
A
wyłącznie na poziomie dokumentu. Nie jest zgodny z definicją atomu znaną z systemów relacyjnych baz danych, w szczególności powyższym linkiem. W tym sensie MongoDB nie spełnia wymagań A z ACID.C
domyślnie jednorazowy. Można jednak czytać z serwerów pomocniczych w zestawie replik. Możesz mieć tylko ostateczną spójność tym przypadku . Jest to przydatne, jeśli nie masz nic przeciwko czytaniu nieco nieaktualnych danych.I
rozwiązania (ponownie zgodnie z powyższą definicją):D
- możesz skonfigurować to zachowanie zwrite concern
opcją, ale nie jestem pewien. Może ktoś wie lepiej.Wierzę, że trwają badania nad przesunięciem NoSQL w kierunku ograniczeń ACID lub podobnych. Jest to wyzwanie, ponieważ bazy danych NoSQL są zwykle szybkie (er), a ograniczenia ACID mogą znacznie spowolnić wydajność.
źródło
Jedynym powodem, dla którego atomic modyfikuje pracę przeciwko pojedynczej kolekcji, jest to, że programiści mongodb niedawno wymienili blokadę bazy danych na blokadę zapisu dla całej kolekcji. Decyzja, że zwiększona współbieżność tutaj była warta kompromisu. U podstaw mongodb jest plik odwzorowany w pamięci: delegowali zarządzanie pulą buforów do podsystemu VM maszyny. Ponieważ zawsze jest w pamięci, są w stanie uciec z bardzo naturalnymi szczegółami: podczas operacji będziesz wykonywać operacje tylko w pamięci, co będzie niezwykle szybkie. Różni się to znacznie od tradycyjnego systemu baz danych, który czasami jest zmuszony do wykonywania operacji we / wy podczas przytrzymywania pagelock lub rowlock.
źródło
„W MongoDB operacja na jednym dokumencie ma charakter atomowy” - to już przeszłość
W nowej wersji MongoDB 4.0 MOŻESZ:
Chociaż istnieje kilka ograniczeń dotyczących tego, jak i jakie operacje można wykonać.
Sprawdź dokument Mongo. https://docs.mongodb.com/master/core/transactions/
źródło
Możesz wdrożyć atomowe aktualizacje z wieloma kluczami (transakcja możliwa do serializacji) po stronie klienta, jeśli pamięć obsługuje liniowość według klucza i umożliwia porównanie i zestaw (co jest prawdą w przypadku MongoDB). Takie podejście jest stosowane w Perkolatorze Google i CockroachDB, ale nic nie stoi na przeszkodzie, aby używać go z MongoDB.
Stworzyłem wizualizację takich transakcji krok po kroku . Mam nadzieję, że pomoże ci to zrozumieć.
Jeśli nie masz nic przeciwko odczytaniu zatwierdzonego poziomu izolacji, warto przyjrzeć się temu nic przeciwko odczytaniu zatwierdzonego transakcjom RAMP autorstwa Petera Bailisa. Można je również wdrożyć dla MongoDB po stronie klienta.
źródło