Mongoose版本控制:什么时候禁用它是安全的?

时间:2013-07-23 12:48:51

标签: mongodb mongoose

来自docs

  

versionKey是首次创建时在每个文档上设置的属性   通过Mongoose。此键值包含的内部修订版   文献。此文档属性的名称是可配置的。该   默认是__v。如果这与您的应用程序冲突,您可以   如此配置:

     

[...]

     

也可以通过将versionKey设置为来禁用文档版本控制   假。除非您知道自己在做什么,否则请勿禁用版本控制。

但我很好奇,在哪些情况下禁用此功能应该是安全的?

1 个答案:

答案 0 :(得分:25)

版本密钥的目的是乐观锁定。

启用后,只要文档更新,版本值就会以原子方式递增。

这允许您的应用程序代码测试是否在获取(例如,引入版本密钥42)和后续更新(确保版本值仍为42)之间进行了更改。 如果版本密钥具有不同的值(例如,43因为已对文档进行了更新),则应用程序代码可以处理并发修改。

在关系数据库中经常使用相同的概念,而不是可能带来可怕性能的悲观锁定。所有下降ORM都提供这样的功能。例如,它被很好地描述为in ObjectDB documentation。它是一个用Java实现的对象数据库,但适用相同的概念。

Behlül评论中链接的blog post通过具体示例展示了乐观锁定的有用性,但仅针对数组更改,请参见下文。

相反,这是一个简单的案例,它无用:用户档案可以由其所有者自己编辑。在这里你可以摆脱乐观锁定,并假设最后一次编辑总是获胜。

所以,只有你知道你的应用程序是否需要乐观锁定。用例用例。

猫鼬情况有点特别。

仅对阵列启用乐观锁定,因为内部存储格式使用位置索引。这是问题评论中链接的blog post所描述的问题。我发现mongoose-orm邮件列表中给出的explanation非常明确:如果您需要对其他字段进行乐观锁定,则需要自己处理。

以下是gist,其中显示了如何为add操作实施重试策略。同样,你想如何处理它取决于你的用例,但它应该足以让你开始。

我希望这能解决问题。

干杯