MongoDB - Operasi Atom
Data Model untuk Operasi Atom
Pendekatan yang direkomendasikan untuk menjaga atomicity adalah dengan menyimpan semua informasi terkait, yang sering diperbarui bersama dalam satu dokumen menggunakan embedded documents. Ini akan memastikan bahwa semua pembaruan untuk satu dokumen bersifat atomic.
Asumsikan kita telah membuat koleksi dengan nama productDetails dan memasukkan dokumen ke dalamnya seperti yang ditunjukkan di bawah ini -
>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 })
>
Dalam dokumen ini, kami telah menyematkan informasi pelanggan yang membeli produk di product_bought_bybidang. Sekarang, setiap kali pelanggan baru membeli produk, pertama-tama kami akan memeriksa apakah produk tersebut masih tersedia menggunakanproduct_availablebidang. Jika tersedia, kami akan mengurangi nilai bidang product_available serta menyisipkan dokumen pelanggan baru yang disematkan ke bidang product_bought_by. Kami akan menggunakanfindAndModify perintah untuk fungsionalitas ini karena mencari dan memperbarui dokumen sekaligus.
>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"}}
}
})
Pendekatan kami terhadap dokumen yang disematkan dan menggunakan kueri findAndModify memastikan bahwa informasi pembelian produk diperbarui hanya jika produk tersebut tersedia. Dan seluruh transaksi ini berada dalam kueri yang sama, bersifat atomik.
Berbeda dengan ini, pertimbangkan skenario di mana kami mungkin menyimpan ketersediaan produk dan informasi tentang siapa yang telah membeli produk secara terpisah. Dalam hal ini, pertama-tama kami akan memeriksa apakah produk tersedia menggunakan kueri pertama. Kemudian di kueri kedua kami akan memperbarui informasi pembelian. Namun, ada kemungkinan bahwa di antara eksekusi kedua kueri ini, beberapa pengguna lain telah membeli produk dan produk tersebut tidak lagi tersedia. Tanpa mengetahui ini, kueri kedua kami akan memperbarui informasi pembelian berdasarkan hasil kueri pertama kami. Ini akan membuat database tidak konsisten karena kita telah menjual produk yang tidak tersedia.