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