Je to opravdu trochu široké, ale mohu nabídnout široké tahy. Od MongoDB používá uzamykání na úrovni kolekce s výchozím úložištěm. K dispozici je také úložný modul WiredTiger, který implementuje uzamčení na úrovni dokumentu . Ale v zásadě ve všech verzích existuje určitá úroveň "uzamykání", ke kterému dochází při každém požadavku. Čím jemnější úroveň, tím lépe v závislosti na vašich skutečných potřebách propustnosti.
V podstatě žádné dva požadavky ve skutečnosti neproběhnou současně, protože se „zablokují“ na zámku, který je proveden, dokud není uvolněn. Takže hodnota, která by byla vrácena (řekněme findAndModify()
request ), bude k "aktuálnímu stavu" v době, kdy byl tento požadavek podán.
Takže na takový požadavek by příkaz, který byl proveden jako první, vrátil hodnotu 2 a další provedený příkaz by vrátil hodnotu 3. Konečná pozice v databázi je taková, že hodnota by v současnosti byla 3.
Neexistuje tedy žádný způsob, jak by se něco mohlo „upravit“ současně a konečný stav by byl stav, který nastane po vydání „všech“ požadavků. Takže $inc
a další operátoři dělají přesně tak, jak mají, a upravují obsah na základě stavu dokumentu v době, kdy k němu byl skutečně schopen přistupovat.