MongoDB - Atomik İşlemler
Atomik İşlemler için Model Verileri
Atomikliği korumak için önerilen yaklaşım, sık sık güncellenen tüm ilgili bilgileri kullanarak tek bir belgede tutmak olacaktır. embedded documents. Bu, tek bir belge için tüm güncellemelerin atomik olmasını sağlar.
ProductDetails adlı bir koleksiyon oluşturduğumuzu ve içine aşağıda gösterildiği gibi bir belge eklediğimizi varsayalım -
>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 })
>
Bu belgede, ürünü satın alan müşterinin bilgilerini product_bought_byalan. Şimdi, yeni bir müşteri ürünü satın aldığında, ilk olarak ürünün hala mevcut olup olmadığını kontrol edeceğiz.product_availablealan. Varsa, product_available alanının değerini düşürmenin yanı sıra yeni müşterinin gömülü belgesini product_bought_by alanına ekleyeceğiz. KullanacağızfindAndModify bu işlevsellik için komut, çünkü aynı anda belgeyi arar ve günceller.
>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"}}
}
})
Gömülü belge ve findAndModify sorgusunu kullanma yaklaşımımız, ürün satın alma bilgilerinin yalnızca ürün mevcutsa güncellenmesini sağlar. Ve bu işlemin tamamı aynı sorguda olmak atomiktir.
Bunun aksine, ürün mevcudiyetini ve ürünü kimin satın aldığına ilişkin bilgileri saklamış olabileceğimiz senaryoyu ayrı ayrı düşünün. Bu durumda, ilk sorguyu kullanarak ürünün mevcut olup olmadığını kontrol edeceğiz. Ardından ikinci sorguda satın alma bilgilerini güncelleyeceğiz. Ancak, bu iki sorgunun yürütülmesi arasında başka bir kullanıcının ürünü satın almış olması ve artık mevcut olmaması mümkündür. Bunu bilmeden, ikinci sorgumuz satın alma bilgilerini ilk sorgumuzun sonucuna göre güncelleyecektir. Bu, mevcut olmayan bir ürün sattığımız için veritabanını tutarsız hale getirecektir.