È davvero un po' ampio, ma posso offrire i tratti più ampi. A partire da MongoDB utilizza il blocco a livello di raccolta con il motore di archiviazione predefinito. È disponibile anche il motore di archiviazione WiredTiger che implementa blocco a livello di documento . Ma fondamentalmente in tutte le versioni c'è un certo livello di "blocco" che si verifica su ogni richiesta. Più fine è il livello, meglio è a seconda delle tue effettive esigenze di throughput.
In sostanza, non si verificano effettivamente due richieste contemporaneamente poiché "bloccheranno" il blocco eseguito fino a quando non verrà rilasciato. Quindi il valore che verrebbe restituito ( ad esempio a findAndModify()
request ), si troverebbe nello "stato corrente" di quando è stata effettuata la richiesta.
Quindi, su tale richiesta, l'istruzione eseguita per prima restituirà un valore di 2 e l'istruzione successiva restituirà un valore di 3. La posizione finale nel database è che il valore sarebbe attualmente 3.
Quindi non c'è modo che qualcosa possa "modificare" allo stesso tempo e lo stato finale sarebbe quello che si verifica dopo che "tutte" le richieste sono state emesse. Quindi $inc
e altri operatori fanno esattamente come dovrebbero e modificano il contenuto in base allo stato del documento nel momento in cui è stato effettivamente in grado di accedervi.