É um pouco amplo, na verdade, mas posso oferecer os traços amplos. A partir do MongoDB usa bloqueio de nível de coleção com o mecanismo de armazenamento padrão. Há também o mecanismo de armazenamento WiredTiger disponível que implementa bloqueio de nível de documento . Mas basicamente em todas as versões existe algum nível de "bloqueio" que acontece em cada solicitação. Quanto mais fino o nível, melhor, dependendo de suas necessidades reais de taxa de transferência.
Essencialmente, duas solicitações não acontecem ao mesmo tempo, pois elas "bloqueiam" o bloqueio feito até que ele seja liberado. Portanto, o valor que seria retornado (por exemplo, um
findAndModify()
request ), seria a partir do "estado atual" para quando essa solicitação foi feita. Assim, em tal solicitação, a instrução executada primeiro retornaria um valor de 2, e a próxima instrução executada retornaria um valor de 3. A posição final no banco de dados é que o valor atualmente seria 3.
Portanto, não há como algo "modificar" ao mesmo tempo, e o estado final seria aquele que ocorre após "todas" as solicitações serem emitidas. Então
$inc
e outros operadores fazem exatamente o que deveriam e modificam o conteúdo com base no estado do documento no momento em que ele foi realmente capaz de acessá-lo.