两个更新都会成功,对吗?
是的。
假设更新方法是这样的:db.collection.updateOne( { id: 1 }, { owner: name } ),其中id是唯一的产品 id 字段,“name”值是“laura”或“karen”,具体取决于请求。两次更新都会成功。
但是,最终结果可能是“laura”或“karen”。您不知道哪个更新将首先到达数据库。因此,无法保证owner更新后文档中的值是多少。
请注意,读取和更新是两个独立的操作(如在 CRUD 中)。阅读文档并不意味着请求以任何方式拥有该文档。文档说“在 MongoDB 中,对单个文档的操作是原子的”;这也适用于更新操作。
据我了解 MongoDB,结果将是“劳拉”。
或许。
除非您以某种方式控制数据库中更新发生的顺序,否则无法保证最终结果是什么。
但是,我可以通过添加 where 子句 name="bob" 来解决这个问题,因为更改在一个文档中,还是我需要更高级的功能,例如事务?或者这仅适用于多文档更新?
添加这样的 where 子句db.collection.updateOne( { id: 1, owner: "bob"}, { owner: name } )将确保只发生一次更新操作。同样,不能保证会发生哪个更新。
交易?
事务只能与副本集(MongoDB 4.0+ 版)和分片集群(MongoDB 4.2+ 版)一起使用;不适用于独立 MongoDB 安装。
您的上述场景的应用程序是否需要事务?不会。更新是单个操作,MongoDB 保证它是原子操作。通常,当有多个 CRUD 操作作为单个单元执行时,事务处理很有用(例如,发票生成可能会创建发票文档并更新库存和帐户集合 - 所有操作作为一个单元发生或根本不发生)。