$inc 修饰符如何处理 mongodb 中的并发请求?
How does the $inc modifier work with concurrent requests in mongodb?
$inc
修饰符可用于增加字段(例如分析计数器、页面浏览量等)。
如果有并发请求,它是如何工作的?
假设我有文件:
{ "views" : 1 }
如果有两个并发请求使用 $inc
会怎样?观看次数是 2 次还是 3 次?
它确实有点宽泛,但我可以提供大致的思路。自 MongoDB 起使用 collection level locking with the default storage engine. There is also the WiredTiger storage engine available which implements document level locking。但基本上在所有版本中,每个请求都会发生某种程度的 "locking"。级别越细越好,看你实际的吞吐量需求。
基本上没有两个请求实际上同时发生,因为它们将 "block" 锁定在释放之前创建的锁定。因此,returned 的值(比如 findAndModify()
请求)将是 "current state" 发出该请求时的值。
所以在这样的请求上,首先执行的语句将 return 值为 2,下一个执行的语句将 return 值为 3。数据库中的结束位置是该值目前为 3.
所以无法同时 "modify",最终状态将是在发出 "all" 请求后发生的状态。所以 $inc
和其他运营商完全按照他们应该做的,并根据文档实际能够访问时的状态修改内容。
$inc
修饰符可用于增加字段(例如分析计数器、页面浏览量等)。
如果有并发请求,它是如何工作的?
假设我有文件:
{ "views" : 1 }
如果有两个并发请求使用 $inc
会怎样?观看次数是 2 次还是 3 次?
它确实有点宽泛,但我可以提供大致的思路。自 MongoDB 起使用 collection level locking with the default storage engine. There is also the WiredTiger storage engine available which implements document level locking。但基本上在所有版本中,每个请求都会发生某种程度的 "locking"。级别越细越好,看你实际的吞吐量需求。
基本上没有两个请求实际上同时发生,因为它们将 "block" 锁定在释放之前创建的锁定。因此,returned 的值(比如 findAndModify()
请求)将是 "current state" 发出该请求时的值。
所以在这样的请求上,首先执行的语句将 return 值为 2,下一个执行的语句将 return 值为 3。数据库中的结束位置是该值目前为 3.
所以无法同时 "modify",最终状态将是在发出 "all" 请求后发生的状态。所以 $inc
和其他运营商完全按照他们应该做的,并根据文档实际能够访问时的状态修改内容。