Nó thực sự hơi rộng nhưng tôi có thể đưa ra những nét chính. Kể từ MongoDB sử dụng khóa mức thu với công cụ lưu trữ mặc định. Ngoài ra còn có công cụ lưu trữ WiredTiger triển khai khóa cấp độ tài liệu . Nhưng về cơ bản trong tất cả các bản phát hành có một số mức độ "khóa" xảy ra trên mỗi yêu cầu. Mức độ càng mịn càng tốt tùy thuộc vào nhu cầu thông lượng thực tế của bạn.
Về cơ bản, không có hai yêu cầu nào thực sự xảy ra cùng một lúc vì chúng sẽ "chặn" trên khóa được thực hiện cho đến khi nó được phát hành. Vì vậy, giá trị sẽ được trả về (giả sử là findAndModify()
request), sẽ là "trạng thái hiện tại" khi yêu cầu đó được thực hiện.
Vì vậy, với một yêu cầu như vậy, câu lệnh được thực hiện đầu tiên sẽ trả về giá trị là 2 và câu lệnh được thực thi tiếp theo sẽ trả về giá trị là 3. Vị trí kết thúc trong cơ sở dữ liệu là giá trị hiện tại sẽ là 3.
Vì vậy, không có cách nào đó có thể "sửa đổi" cùng một lúc và trạng thái kết thúc sẽ là trạng thái xảy ra sau khi "tất cả" yêu cầu đã được đưa ra. Vì vậy, $inc
và các nhà khai thác khác làm đúng như những gì họ cần và sửa đổi nội dung dựa trên trạng thái của tài liệu tại thời điểm tài liệu thực sự có thể truy cập.