Обеспечивает ли Mongo изоляцию при обновлении отдельных документов? - PullRequest
0 голосов
/ 08 февраля 2012

Документация Mongo об атомарности и изоляции немного расплывчата и немного запутана.У меня есть эта структура документа, и я хочу убедиться, что mongo будет обрабатывать обновления, изолируя обновленные от разных пользователей.

Предположим, что существует коллекция скидок.Когда пользователь выкупает предложение, поле offers_redeemed увеличивается.Поле max_allowed_redemptions контролирует, сколько раз предложение может быть погашено.

{ 
     offer_id: 99,
     description: “Save 25% on Overstock.com…” 
     max_allowed_redemptions: 10,
     offers_redeemed: 3
}

Я проверил это, используя findAndModify, и оно работает, обновляя предложение, только если другое погашение будет меньше или равномаксимально разрешено;Я хочу знать, является ли это правильным способом сделать это и будет ли это работать в многопользовательской, изолированной среде.Есть ли сценарий, когда обновление до offers_redeemed заставит его превысить max_allowed_redemptions?очевидно, что это испортило бы запись, поэтому мы должны избегать ее.

db.offer.findAndModify({
   query:{ offer_id: 99, $where: “this.offers_redeemed + 1 <= this.max_allowed_redemptions”},
   update: {$inc: {offers_redeemed: 1},
   new: true })

1 Ответ

2 голосов
/ 08 февраля 2012

Во-первых, как очень ясно сказано в документации

Если вам не нужно возвращать документ, вы можете использовать Обновление (что также может повлиять на несколько документов).

Во-вторых, посмотрите на Обновление, если Текущее стратегия на атомной странице. Это ясно показывает, что если условие применяется, тогда происходит обновление, и между ними ничего не может быть.

...