MongoDB hỗ trợ cập nhật nguyên tử. I E. Tôi có thể chắc chắn rằng khi một tài liệu được cập nhật, không có cập nhật nào khác sẽ ghi đè thay đổi trước đó của tôi. Câu hỏi của tôi liên quan đến sự kết hợp của câu truy vấn và câu lệnh cập nhật, và được minh họa tốt nhất bằng ví dụ dưới đây.Nguyên tử cập nhật của MongoDB có áp dụng cho cả truy vấn và sửa đổi không?
db.foo.update(
{ state : 1, players: { $size: 2 } } ,
{ $push: { players : { new player document } } },
false , true);
Trong ví dụ trên, tôi chỉ muốn đẩy một cầu thủ mới vào một bộ sưu tập của các cầu thủ, nếu số lượng người chơi bằng 2. Với các truy vấn trên và báo cáo cập nhật, nó có thể là hai bản cập nhật đồng thời cả đẩy một người chơi lên cùng một tài liệu, vì tại thời điểm đọc tài liệu, người chơi của nó có kích thước $ là 2? I E. Liệu các atomicity span trên truy vấn và cập nhật một phần của báo cáo cập nhật hay không?
Sửa khác ở sâu chuỗi các sự kiện:
xem xét bắn cập nhật hai lần (U1 và U2) cùng một lúc. Chuỗi sự kiện sau đây có thể xảy ra hay không?
- U1 tìm thấy tài liệu # 1 khớp với phần truy vấn của bản cập nhật .
- U2 tìm thấy tài liệu # 1 khớp với phần truy vấn của tuyên bố cập nhật.
- U1 đẩy trình phát mới vào tài liệu số 1.
- U2 sẽ đẩy trình phát mới vào tài liệu số 1.
Kết quả cuối cùng là tài liệu # 1 chứa một trình phát nhiều hơn mong đợi, vì cả U1 và U2 đều có ấn tượng là tài liệu # 1 chỉ chứa hai người chơi.
Cảm ơn bạn đã trả lời. Tôi đã cập nhật câu hỏi của mình với một chuỗi sự kiện, điều mà tôi hy vọng làm rõ mọi thứ một chút. Bây giờ tôi nhận ra rằng những gì tôi hỏi về không phải là nguyên tử, mà là một giao dịch (khóa) ở cấp độ tài liệu. –
Có, điều đó thực sự làm rõ câu hỏi. Bạn không có gì phải lo lắng. Không có gì có thể thay đổi tài liệu giữa tìm và cập nhật (bước 2 và 4) hoặc hoạt động sẽ không phải là nguyên tử. Nếu nó không hoạt động theo cách này, thì đó là một lỗi và nên được báo cáo như vậy. – johndodo