Ini agak luas sebenarnya tapi saya bisa menawarkan sapuan yang luas. Pada MongoDB menggunakan penguncian level koleksi dengan mesin penyimpanan default. Ada juga mesin penyimpanan WiredTiger yang mengimplementasikan penguncian tingkat dokumen . Tetapi pada dasarnya di semua rilis ada beberapa tingkat "penguncian" yang terjadi pada setiap permintaan. Semakin halus levelnya, semakin baik tergantung pada kebutuhan throughput Anda yang sebenarnya.
Pada dasarnya tidak ada dua permintaan yang benar-benar terjadi pada saat yang sama karena mereka akan "memblokir" kunci yang dibuat sampai dilepaskan. Jadi nilai yang akan dikembalikan ( katakanlah findAndModify()
request ), akan menjadi "status saat ini" ketika permintaan itu dibuat.
Jadi pada permintaan seperti itu, pernyataan yang dieksekusi pertama akan mengembalikan nilai 2, dan pernyataan yang dieksekusi berikutnya akan mengembalikan nilai 3. Posisi akhir dalam database adalah bahwa nilainya saat ini adalah 3.
Jadi tidak mungkin sesuatu dapat "memodifikasi" pada saat yang sama, dan keadaan akhirnya adalah apa yang terjadi setelah "semua" permintaan dikeluarkan. Jadi $inc
dan operator lain melakukan persis seperti yang seharusnya, dan memodifikasi konten berdasarkan status dokumen pada saat itu benar-benar dapat mengaksesnya.