MongoDB - 原子操作



原子操作模型資料

維護原子性的推薦方法是,使用**嵌入文件**將所有經常一起更新的相關資訊儲存在單個文件中。這將確保單個文件的所有更新都是原子的。

假設我們已經建立了一個名為 productDetails 的集合,並在其中插入瞭如下所示的文件:

>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 })
>

在此文件中,我們在 **product_bought_by** 欄位中嵌入了購買產品的客戶的資訊。現在,每當新客戶購買產品時,我們首先會使用 **product_available** 欄位檢查產品是否仍然可用。如果可用,我們將減少 product_available 欄位的值,並同時在 product_bought_by 欄位中插入新客戶的嵌入文件。我們將使用 **findAndModify** 命令來實現此功能,因為它可以同時搜尋和更新文件。

>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"}} 
   }    
})

我們使用嵌入文件和 findAndModify 查詢的方法確保了只有在產品可用時才會更新產品購買資訊。並且由於整個事務都在同一個查詢中完成,因此它是原子的。

與此相反,考慮一下我們將產品可用性和購買產品者資訊分開儲存的情況。在這種情況下,我們將首先使用第一個查詢檢查產品是否可用。然後在第二個查詢中,我們將更新購買資訊。但是,這兩個查詢執行之間,其他使用者可能已經購買了產品,導致產品不再可用。在不知道這種情況的情況下,我們的第二個查詢將根據第一個查詢的結果更新購買資訊。這將導致資料庫不一致,因為我們出售了實際上不可用的產品。

廣告