首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB 4.0事务: ACID读+写?

MongoDB 4.0事务: ACID读+写?
EN

Stack Overflow用户
提问于 2018-05-31 14:36:20
回答 1查看 4K关注 0票数 8

因此,MongoDB 4.0提供了多文档事务。我的问题是,这是否启用了与SQL过程相同的功能?

用例将是

  1. 锁定集合
  2. 从收藏中读取
  3. 根据2的结果写到收集。
  4. 背诵/中止

常见的db驱动程序通常只会将发出的所有命令堆在一起,直到调用commit,然后在db的机器上逐个运行它们。因此,我在服务器代码中运行的任何读取都是在事务实际执行之前运行的,因此其他连接可以在读操作和写操作之间更改数据。

MongoDB 4.0将涵盖此功能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 01:47:22

MongoDB 4.0将涵盖此功能吗?

简单地说,原子性是肯定的。

在MongoDB中,交易记录 (也称为多文档事务)与会话相关联。也就是说,您为会话启动事务。在任何给定的时间,您最多可以为一个会话拥有一个打开的事务。

您不能锁定整个集合以进行写入。您可能希望创建多个事务,以确保写入不会在进程之间交错/重写。MongoDB使用乐观锁定而不是悲观锁定

因此,我在服务器代码中运行的任何读取都是在实际执行事务之前运行的,因此其他连接可以在读操作和写操作之间更改数据。

类似地,在MongoDB中,多文档事务。例如,使用蒙戈壳

代码语言:javascript
复制
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事务背后的一些技术解释。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50626838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档