W rzeczywistości jest trochę szeroka, ale mogę zaoferować szerokie pociągnięcia. Od MongoDB używa blokowania na poziomie kolekcji z domyślnym aparatem pamięci masowej. Dostępny jest również silnik pamięci WiredTiger, który implementuje blokowanie na poziomie dokumentu . Ale w zasadzie we wszystkich wydaniach istnieje pewien poziom "blokowania", który ma miejsce przy każdym żądaniu. Im wyższy poziom, tym lepiej w zależności od rzeczywistych potrzeb w zakresie przepustowości.
Zasadniczo żadne dwa żądania nie występują w tym samym czasie, ponieważ "blokują" blokadę, która jest wykonana, dopóki nie zostanie zwolniona. Tak więc wartość, która zostanie zwrócona ( na przykład findAndModify()
request ), będzie miał „stan bieżący” w momencie, w którym zgłoszono żądanie.
Zatem przy takim żądaniu instrukcja, która została wykonana jako pierwsza, zwróci wartość 2, a następna wykonana instrukcja zwróci wartość 3. Końcową pozycją w bazie danych jest to, że wartość obecnie wynosi 3.
Nie ma więc możliwości, aby coś mogło „zmodyfikować” w tym samym czasie, a stanem końcowym byłby ten, który występuje po wysłaniu „wszystkich” żądań. Więc $inc
a inni operatorzy robią dokładnie to, co powinni, i modyfikują zawartość w oparciu o stan dokumentu w momencie, w którym faktycznie był w stanie uzyskać do niego dostęp.