MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie funktioniert der Modifikator $inc bei gleichzeitigen Anfragen in mongodb?

Es ist wirklich ein bisschen breit, aber ich kann die breiten Striche anbieten. Ab MongoDB verwendet Sperrung auf Sammlungsebene mit der Standard-Speicher-Engine. Es ist auch die WiredTiger-Speicher-Engine verfügbar, die implementiert Sperren auf Dokumentebene . Aber im Grunde gibt es in allen Releases ein gewisses Maß an "Sperren", das bei jeder Anfrage passiert. Je feiner die Stufe, desto besser, abhängig von Ihren tatsächlichen Durchsatzanforderungen.

Im Wesentlichen erfolgen keine zwei Anforderungen gleichzeitig, da sie die Sperre "blockieren", die erstellt wird, bis sie freigegeben wird. Also der Wert, der zurückgegeben würde (z. B. ein findAndModify() Anfrage ), wäre der "aktuelle Stand", als diese Anfrage gestellt wurde.

Bei einer solchen Anfrage würde also die zuerst ausgeführte Anweisung einen Wert von 2 zurückgeben, und die nächste ausgeführte Anweisung würde einen Wert von 3 zurückgeben. Die Endposition in der Datenbank ist, dass der Wert derzeit 3 ​​wäre.

Es gibt also keine Möglichkeit, dass etwas gleichzeitig "geändert" werden kann, und der Endzustand wäre derjenige, der eintritt, nachdem "alle" Anforderungen ausgegeben wurden. Also $inc und andere Operatoren tun genau das, was sie sollten, und ändern den Inhalt basierend auf dem Status des Dokuments zu dem Zeitpunkt, als sie tatsächlich darauf zugreifen konnten.