2013-07-23 45 views
8

docsMongoose版本控制:何时可以安全地禁用它?

的versionKey是当首先由猫鼬创建 每个文档设置属性。此键值包含 文档的内部修订版。此文档属性的名称是可配置的。 默认为__v。如果冲突与您的应用程序,你可以 配置为这样:

[...]

文档版本控制,也可以通过versionKey设置为 假禁用。除非你知道你在做什么,否则不要禁用版本控制。

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

+1

这篇博客文章讨论了你在哪个位置访问子文档数组中的元素的情况。但猫鼬实际上使用ID而不是位置。所以我不确定: http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning –

回答

20

版本的关键目的是乐观锁定。

启用后,只要更新文档,版本值就会自动递增。

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

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

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

相反,这里是一个简单的例子,它没有用处:一个用户配置文件,可以由其所有者自己编辑。在这里,您可以摆脱乐观锁定,并假定最后一次编辑总是获胜。

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

猫鼬的情况有点特别。

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

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

我希望这可以解决问题。

干杯

+1

如果我们使用'$ in'操作符访问子文档,是否需要版本控制?它似乎与访问父文档不同。 –

+0

再一次取决于用例。当使用$ in操作符时,您会收紧并发修改窗口,但请记住它仍处于打开状态。 – eskatos

+1

@esKotos我认为你的新更新答案看起来不明确,因为当我们只更新任何非数组字段时,版本控制不起作用。 –