English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
A maneira de manter a atomicidade das recomendações é manter todas as informações relevantes, que são frequentemente atualizadas juntas em um documento anexado. Isso garante que todas as atualizações de um único documento sejam atômicas.
Supondo que já tenhamos criado uma coleção chamada productDetails e inserido um documento, conforme exemplo a seguir-
>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, vamos incorporar as informações dos clientes que compraram produtos no campo product_bought_by. Agora, sempre que um novo cliente comprar um produto, usaremos o campo product_available para verificar se o produto ainda está disponível. Se disponível, reduziremos o valor do campo product_available e inseriremos o documento anexado do novo cliente no campo product_bought_by. Usaremos o comando findAndModify para essa função, pois o processo de busca e atualização do documento é o mesmo.
>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"}} } )
Nós adotamos o método de documento aninhado e a consulta findAndModify para garantir que as informações de compra do produto sejam atualizadas apenas quando o produto estiver disponível. Todo o processo da transação está contido na mesma consulta, é atômico.
Por outro lado, considere a seguinte situação: podemos ter preservado separadamente a disponibilidade do produto e informações sobre quem comprou o produto. Neste caso, usaremos a primeira consulta para verificar se o produto está disponível. Em seguida, na segunda consulta, atualizaremos as informações de compra. No entanto, é possível que, entre a execução dessas duas consultas, outros usuários já tenham comprado o produto e ele já não esteja disponível. Sem saber disso, nossa segunda consulta atualizará as informações de compra com base no resultado da primeira consulta. Isso tornará o banco de dados inconsistente, pois já vendemos um produto não disponível.