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