MongoDB ma obsługę aktualizacji atomowych. To znaczy. Mogę być pewien, że po aktualizacji dokumentu żadna inna aktualizacja nie zastąpi mojej poprzedniej zmiany. Moje pytanie dotyczy kombinacji zapytania i instrukcji aktualizacji i najlepiej ilustruje to przykład przedstawiony poniżej.Czy atomowość aktualizacji MongoDB dotyczy zarówno zapytania, jak i modyfikacji?
db.foo.update(
{ state : 1, players: { $size: 2 } } ,
{ $push: { players : { new player document } } },
false , true);
W powyższym przykładzie, chcę tylko do pchania nowego gracza na zbiór graczy, jeśli liczba graczy jest równa 2. Biorąc pod uwagę powyższe zestawienie zapytań i aktualizacji, to możliwe, że dwa jednoczesne aktualizacje zarówno popchnąć gracza na ten sam dokument, ponieważ w chwili czytania dokumentu jego gracze $ size to 2? To znaczy. czy rozpiętość atomowości w zapytaniu i aktualizuje część instrukcji aktualizacji, czy nie?
Edit Więcej sekwencja dogłębne wydarzeń:
Rozważmy wypalania samą aktualizację dwukrotnie (U1 i U2) w tym samym czasie. Czy możliwa jest następująca sekwencja zdarzeń, czy nie?
- U1 stwierdza, że dokument nr 1 pasuje do części zapytania instrukcji aktualizacji .
- U2 stwierdza, że dokument nr 1 pasuje do części zapytania dotyczącej instrukcji aktualizacji.
- U1 przesuwa nowego gracza w dokumencie nr 1.
- U2 popycha nowego gracza w dokumencie nr 1.
Rezultatem jest to, że dokument # 1 zawiera jeszcze jednego gracza, niż się spodziewano, ponieważ zarówno U1, jak i U2 były pod wrażeniem, że dokument nr 1 zawiera tylko dwóch graczy.
Dziękuję za odpowiedź. Zaktualizowałem moje pytanie sekwencją zdarzeń, które mam nadzieję nieco wyjaśnić. Teraz zdaję sobie sprawę, że to, o co pytam, to nie atomowość, ale transakcja (blokada) na poziomie dokumentu. –
Tak, to rzeczywiście wyjaśnia pytanie. Nie masz się czego obawiać. Nic nie może zmienić dokumentu między znalezieniem a aktualizacją (kroki 2 i 4) lub operacja nie byłaby atomowa. Jeśli nie działa w ten sposób, oznacza to błąd i powinien zostać zgłoszony jako taki. – johndodo