【发布时间】:2012-04-06 08:25:01
【问题描述】:
MongoDB 支持原子更新。 IE。我可以确定,当文档更新时,没有其他更新会覆盖我之前的更改。我的问题与查询和更新语句的组合有关,下面的示例可以很好地说明。
db.foo.update(
{ state : 1, players: { $size: 2 } } ,
{ $push: { players : { new player document } } },
false , true );
在上面的例子中,如果玩家数量等于 2,我只想将一个新玩家推送到玩家集合中。鉴于上面的查询和更新语句,是否有可能两个同时更新都将一个玩家推送到同一个文件,因为在阅读文件时它的 player $size 是 2? IE。原子性是否跨越查询和更新语句的更新部分?
编辑更深入的事件序列:
考虑同时触发相同的更新两次(U1 和 U2)。以下事件序列是否可能?
- U1 发现文档 #1 与更新的查询部分匹配 陈述。
- U2 发现文档 #1 与 更新声明。
- U1 在文档 #1 中推送了一个新玩家。
- U2 在文档 #1 中推送了一个新玩家。
最终结果是文档 #1 包含的玩家比预期的多,因为 U1 和 U2 都认为文档 #1 仅包含两个玩家。
【问题讨论】:
标签: mongodb