【发布时间】:2017-06-30 16:22:32
【问题描述】:
$inc 修饰符可用于增加字段(例如用于分析的计数器、页面浏览量等)。
如果有并发请求,它是如何工作的?
假设我有文件:
{ "views" : 1 }
如果有两个并发请求使用 $inc 会发生什么?观看次数是 2 还是 3?
【问题讨论】:
标签: mongodb mongodb-query
$inc 修饰符可用于增加字段(例如用于分析的计数器、页面浏览量等)。
如果有并发请求,它是如何工作的?
假设我有文件:
{ "views" : 1 }
如果有两个并发请求使用 $inc 会发生什么?观看次数是 2 还是 3?
【问题讨论】:
标签: mongodb mongodb-query
确实有点宽泛,但我可以提供宽泛的笔触。从 MongoDB 开始,默认存储引擎使用 collection level locking。还有实现document level locking 的WiredTiger 存储引擎。但基本上在所有版本中,每个请求都会发生某种程度的“锁定”。级别越精细越好,具体取决于您的实际吞吐量需求。
基本上没有两个请求实际上是同时发生的,因为它们会“阻塞”在所生成的锁上,直到它被释放。因此,将返回的值(例如 findAndModify() 请求)将是发出该请求时的“当前状态”。
因此,在这样的请求中,首先执行的语句将返回值 2,下一个执行的语句将返回值 3。数据库中的结束位置是该值当前为 3。
因此,不可能同时“修改”某些东西,最终状态将是在发出“所有”请求之后发生的状态。所以$inc和其他运营商完全按照他们应该做的,根据文档实际能够访问时的状态来修改内容。
【讨论】: