MongoDB - Operações Atômicas
Dados de modelo para operações atômicas
A abordagem recomendada para manter a atomicidade seria manter todas as informações relacionadas, que são frequentemente atualizadas juntas em um único documento usando embedded documents. Isso garantiria que todas as atualizações de um único documento fossem atômicas.
Suponha que criamos uma coleção com o nome productDetails e inserimos documentos como mostrado abaixo -
>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 })
>
Neste documento, incorporamos as informações do cliente que compra o produto no product_bought_bycampo. Agora, sempre que um novo cliente comprar o produto, primeiro verificaremos se o produto ainda está disponível usandoproduct_availablecampo. Se disponível, reduziremos o valor do campo product_available, bem como inseriremos o novo documento incorporado do cliente no campo product_bought_by. Nós vamos usarfindAndModify comando para esta funcionalidade porque pesquisa e atualiza o documento ao mesmo tempo.
>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"}}
}
})
Nossa abordagem de documento incorporado e usando a consulta findAndModify garante que as informações de compra do produto sejam atualizadas apenas se o produto estiver disponível. E toda essa transação estando na mesma consulta, é atômica.
Em contraste com isso, considere o cenário em que podemos ter mantido a disponibilidade do produto e as informações sobre quem comprou o produto, separadamente. Nesse caso, primeiro verificaremos se o produto está disponível usando a primeira consulta. Então, na segunda consulta, vamos atualizar as informações de compra. Porém, é possível que entre as execuções dessas duas consultas, algum outro usuário tenha adquirido o produto e ele não esteja mais disponível. Sem saber disso, nossa segunda consulta atualizará as informações de compra com base no resultado de nossa primeira consulta. Isso tornará o banco de dados inconsistente porque vendemos um produto que não está disponível.