Наистина е малко широко, но мога да предложа широките щрихи. От MongoDB използва заключване на ниво колекция с механизма за съхранение по подразбиране. Налице е и механизмът за съхранение WiredTiger, който прилага заключване на ниво документ . Но основно във всички версии има някакво ниво на „заключване“, което се случва при всяка заявка. Колкото по-фино е нивото, толкова по-добре в зависимост от вашите действителни нужди от пропускателна способност.
По същество няма две заявки, които да се случват по едно и също време, тъй като те ще „блокират“ на заключването, което е направено, докато не бъде освободено. Така че стойността, която ще бъде върната (да речем findAndModify()
заявка ), ще бъде от „текущото състояние“ към момента, в който е направена тази заявка.
Така че при такава заявка операторът, който е бил изпълнен първи, ще върне стойност 2, а следващият изпълнен оператор ще върне стойност 3. Крайната позиция в базата данни е, че стойността в момента ще бъде 3.
Така че няма начин нещо да може да се "промени" по едно и също време и крайното състояние ще бъде това, което се случва след като "всички" заявки са били издадени. Така че $inc
и други оператори правят точно както трябва и променят съдържанието въз основа на състоянието на документа в момента, в който действително са имали достъп до него.