MongoDB - Hoạt động nguyên tử

Dữ liệu mô hình cho các hoạt động nguyên tử

Cách tiếp cận được khuyến nghị để duy trì tính nguyên tử sẽ là giữ tất cả thông tin liên quan, thường xuyên được cập nhật cùng nhau trong một tài liệu duy nhất bằng cách sử dụng embedded documents. Điều này sẽ đảm bảo rằng tất cả các bản cập nhật cho một tài liệu là nguyên tử.

Giả sử chúng ta đã tạo một bộ sưu tập với tên productDetails và chèn một tài liệu vào đó như hình dưới đây -

>db.createCollection("products")
{ "ok" : 1 }
> db.productDetails.insert(
	{
		"_id":1,
		"product_name": "Samsung S3",
		"category": "mobiles",
		"product_total": 5,
		"product_available": 3,
		"product_bought_by": [
			{
				"customer": "john",
				"date": "7-Jan-2014"
			},
			{
				"customer": "mark",
				"date": "8-Jan-2014"
			}
		]
	}
)
WriteResult({ "nInserted" : 1 })
>

Trong tài liệu này, chúng tôi đã nhúng thông tin của khách hàng mua sản phẩm vào product_bought_bycánh đồng. Bây giờ, bất cứ khi nào khách hàng mới mua sản phẩm, trước tiên chúng tôi sẽ kiểm tra xem sản phẩm có còn sử dụng được khôngproduct_availablecánh đồng. Nếu có, chúng tôi sẽ giảm giá trị của trường product_available cũng như chèn tài liệu nhúng của khách hàng mới vào trường product_bought_by. Chúng tôi sẽ sử dụngfindAndModify lệnh cho chức năng này vì nó tìm kiếm và cập nhật tài liệu trong cùng một lúc.

>db.products.findAndModify({ 
   query:{_id:2,product_available:{$gt:0}}, 
   update:{ 
      $inc:{product_available:-1}, 
      $push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}} 
   }    
})

Cách tiếp cận của chúng tôi về tài liệu nhúng và sử dụng truy vấn findAndModify đảm bảo rằng thông tin mua sản phẩm chỉ được cập nhật nếu sản phẩm có sẵn. Và toàn bộ giao dịch này nằm trong cùng một truy vấn, là nguyên tử.

Ngược lại với điều này, hãy xem xét kịch bản trong đó chúng tôi có thể đã lưu giữ sản phẩm sẵn có và thông tin về người đã mua sản phẩm một cách riêng biệt. Trong trường hợp này, trước tiên chúng tôi sẽ kiểm tra xem sản phẩm có sẵn không bằng cách sử dụng truy vấn đầu tiên. Sau đó, trong truy vấn thứ hai, chúng tôi sẽ cập nhật thông tin mua hàng. Tuy nhiên, có thể giữa việc thực hiện hai truy vấn này, một số người dùng khác đã mua sản phẩm và sản phẩm không còn nữa. Nếu không biết điều này, truy vấn thứ hai của chúng tôi sẽ cập nhật thông tin mua hàng dựa trên kết quả của truy vấn đầu tiên của chúng tôi. Điều này sẽ làm cho cơ sở dữ liệu không nhất quán vì chúng tôi đã bán một sản phẩm không có sẵn.