MongoDB 4.0交易:ACID读写?

Tha*_*ude 3 mongodb

所以MongoDB 4.0带有多文档事务.我的问题是,这是否实现了与SQL程序相同的功能?

用例就是

  1. 锁定一个集合
  2. 从收藏中读取
  3. 根据2的结果写入收藏.
  4. commiting /中止

常见的数据库驱动程序通常只会叠加您发出的任何命令,直到您调用commit,然后在db的计算机上依次运行它们.因此,我在服务器代码中运行的任何读取都在事务实际提交之前运行,因此其他连接可能会在读取和写入操作之间更改数据.

MongoDB 4.0会覆盖这个功能吗?

Wan*_*iar 9

MongoDB 4.0会覆盖这个功能吗?

对于原子性,简短的回答是肯定的.

在MongoDB中,事务(也称为多文档事务)与会话相关联.也就是说,您为会话启动事务.在任何时候,你最多只能有一个用于会话打开的事务.

您无法锁定整个集合以进行写入.您可能希望创建多个事务以确保写入不会在进程之间进行隔行扫描/覆盖.MongoDB使用乐观锁定而不是悲观锁定.

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

同样在MongoDB多文档事务中.例如,使用mongo shell:

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. 
Run Code Online (Sandbox Code Playgroud)

另请注意,在事务处于打开状态时,事务中的操作不会在事务外部显示任何数据更改.

  • 当事务提交时,所有数据更改都将保存并在事务外部可见,并且事务结束.
  • 当事务中止时,由事务中的写入所做的所有数据更改都将被丢弃,而不会变得可见并且事务结束.

另请参见原子性示例.

值得注意的是MongoDB是一个分布式数据库,因此您还需要了解不同的一致性选项.您可以在启动Session.startTransaction()时指定这些选项,具体取决于用例:

多文档事务支持读取首选项主要,并且给定事务中的所有操作必须路由到同一成员.

您可能也对Engineering Chalk and Talks:MongoDB Transactions视频感兴趣,其中包含MongoDB事务背后的一些技术解释.

  • 嗨@ThatBrianDude没有自动重试的选项.您需要自己实现该逻辑.这主要是因为并非所有事务都应该/可以根据用例重试.请注意,事务中的写入不支持"retryableWrite". (3认同)