因此,MongoDB 4.0提供了多文档事务。我的问题是,这是否启用了与SQL过程相同的功能?
用例将是
常见的db驱动程序通常只会将发出的所有命令堆在一起,直到调用commit,然后在db的机器上逐个运行它们。因此,我在服务器代码中运行的任何读取都是在事务实际执行之前运行的,因此其他连接可以在读操作和写操作之间更改数据。
MongoDB 4.0将涵盖此功能吗?
发布于 2018-06-04 01:47:22
MongoDB 4.0将涵盖此功能吗?
简单地说,原子性是肯定的。
在MongoDB中,交易记录 (也称为多文档事务)与会话相关联。也就是说,您为会话启动事务。在任何给定的时间,您最多可以为一个会话拥有一个打开的事务。
您不能锁定整个集合以进行写入。您可能希望创建多个事务,以确保写入不会在进程之间交错/重写。MongoDB使用乐观锁定而不是悲观锁定。
因此,我在服务器代码中运行的任何读取都是在实际执行事务之前运行的,因此其他连接可以在读操作和写操作之间更改数据。
类似地,在MongoDB中,多文档事务。例如,使用蒙戈壳
s1 = Mongo().startSession()
sessionTest = s1.getDatabase("databaseName").test;
s1.startTransaction()
sessionTest.find({a:"foo"})
> {_id: ObjectId(..), a:"foo", b:1}
// Let's update the record outside of the session (i.e. another process)
db.test.update({a:"foo"}, {$set:{b:2}})
sessionTest.update({a:"foo"}, {$set:{b:9}})
// You'll get a WriteConflict error because the the document has been modified outside of the session. 还请注意,当事务处于打开状态时,事务中的操作所做的数据更改在事务之外是不可见的。
另见原子性示例。
值得注意的是,MongoDB是一个分布式数据库,因此您还需要了解不同的一致性选项。根据用例,可以在启动Session.startTransaction()时指定这些选项:
多文档事务支持读取首选项主要的,并且给定事务中的所有操作都必须路由到同一个成员。
您也可能对工程Chalk和Talk: MongoDB交易视频感兴趣,其中包含了MongoDB事务背后的一些技术解释。
https://stackoverflow.com/questions/50626838
复制相似问题