1

假设我有一个带有views_count,males_views_countfemales_views_count字段的集合。我希望能够在$inc查看页面时分别(增加)计数字段。

这个问题是我收到了几个并发连接,并且可能会出现竞争情况。

我一直在阅读有关 Mongodb 中的原子操作的信息。他们通常有成功或失败的方法。记录要么是写的,要么不是。这是否意味着我需要创建逻辑来确定操作是否失败,如果失败,请重试?

回到我的场景。如果我想让每个视图都计数(即使发生竞争条件)怎么办。我知道 Mongodb 锁与传统的 RDBMS 略有不同。通常,我会实现一种乐观锁定技术。如同:

begin
  # .. do work .. determine if user is a male or a female
  stat.save
rescue StaleDocumentError
  stat.reload
  retry
end

或者原子操作是否旨在防止竞争条件,因为它是执行更新的服务器并且它对真相是什么具有权威性?如果是这样,我们是否还需要实现乐观/悲观锁定技术,或者如果我们使用原子操作,Mongodb 会为我们解决这个问题?

4

1 回答 1

2

如果您正在使用原子操作,例如$inc没有竞争条件。如果您有来自不同线程的两个增量,它们将按照服务器接收到的顺序应用,并且在应用两个操作后文档上的最终结果将相同。

如果您使用 将字段更新为特定值$set,则“获胜”值将是最后$set应用的值。如果您的应用程序用例可能导致同一字段的更新冲突,那么乐观锁定/版本控制将很有用。

就异常处理而言,您应该假设任何数据库操作都可能导致服务器异常(网络错误、重复键......)并酌情重试。原子更新与非原子更新不需要任何特殊逻辑,除非您选择实现自己的乐观锁定(在这种情况下,您可能会重新获取文档的当前版本并重试操作)。

MongoDB 手册涵盖了Isolate Sequence of Operations中的几种不同模式。

于 2013-09-09T02:16:25.623 回答