2016-04-05 14 views
3

Ben MongoDB ve firavun faresi bir kaydın seviyor alanını artırmak gerekir, ancak bu aynı zamanda güvenli olması gerektiği gibi ben, biraz bu operasyonların bölünmezlik hakkında 'endişeli' değilim:

Post.findById(id, function(err, post) { 
    post.update({$inc: { 
     likes: 1 
    }}); 
}); 

vs

Post.findById(id, function(err, post) { 
    post.likes++; 
    post.save() 
}); 

Aynı güvenli sonucu sağlıyorlar mı? Ben kaydı (kullanıcı gibi butona tıklama tekrar mesela eğer)

Post.findById(id, function(err, post) { 
    post.update({$inc: { 
     likes: -1 
    }}); 
}); 
+0

İkinci durumda işlem atomik değildir, çünkü model kaydedilinceye kadar başka bir istek gönderilebilir ve yüklenen 'beğeniler 'önceki değere sahip olur. – alexmac

+0

Teşekkürler, düşündüğüm buydu. Yorumu bir cevaba dönüştürmek istiyorsanız, –

cevap

1

MongoDB $inc tek bir belge içinde bir atom operasyondur (mongoDB documentation bakınız) gibileri azaltma için bile sahip olduğu gerçeği düşünün.

İkinci durumda, işlem atomik değildir, çünkü model kaydedildiğinde başka bir istek gönderilebilir ve yüklenen likes bir önceki değere sahip olacaktır.

+0

kabul ediyorum Teknik olarak, hala atomik. Sadece doğru değil. – mrBorna

+0

'Post.findById' ve' post.update', hem async işlevlerdir, ne zaman tamamlanacağını kesinlikle bilmezsiniz ve bu süre zarfında başka kaç çağrının işleneceğini görürsünüz. – alexmac

+0

Evet, async'lerdir (Düğümdeki çoğu işlemle olduğu gibi), ancak 'atomik' işlemin zihinsel modeli doğru olduğundan emin değilim. Bu, bir nedenden ötürü operasyonun kesintiye uğraması durumunda, ya "başarısız" durumunda ya başarılı ya da başarısız anlamına gelir. https://docs.mongodb.org/manual/core/write-operations-atomicity/ – mrBorna

İlgili konular