Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb避免不一致_Mongodb_Transactions - Fatal编程技术网

mongodb避免不一致

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”来解决这个问题,因为更改在一个文档中,还是需要更高级的功能,例如事务?或者这仅适用于多文档更新 两

鉴于以下情况:

带有文档产品(id、所有者)和文档p1(1,“bob”)的集合产品

  • 请求1:读取p1
  • 请求2:读取p1
  • 请求2:更新p1 name=“karen”(如果在上次读取时所有者是“bob”)
  • 请求1:更新p1 name=“laura”(如果在上一次阅读中所有者是“bob”)
两个更新都会成功,对吗?据我所知,结果将是“劳拉”。但是,我可以简单地通过添加where子句name=“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操作要作为单个单元执行时,事务处理非常有用(例如,发票生成可能会创建发票文档并更新库存和账户集合-所有操作都作为一个单元进行,或者根本不进行)