MongoDB 4.0推出了多文档事务。我的问题是,这是否可以实现与SQL存储过程相同的功能?
使用情况如下:
- 锁定集合
- 从集合中读取
- 根据2中的结果写入集合
- 提交/中止
通常,常见的数据库驱动程序会将您发出的任何命令堆叠起来,直到您调用提交,然后在数据库机器上依次运行它们。因此,在实际提交事务之前,我在服务器代码中运行的任何读操作都将被运行,并且因此其他连接可能会更改读写操作之间的数据。
MongoDB 4.0是否涵盖此功能?
MongoDB 4.0推出了多文档事务。我的问题是,这是否可以实现与SQL存储过程相同的功能?
使用情况如下:
通常,常见的数据库驱动程序会将您发出的任何命令堆叠起来,直到您调用提交,然后在数据库机器上依次运行它们。因此,在实际提交事务之前,我在服务器代码中运行的任何读操作都将被运行,并且因此其他连接可能会更改读写操作之间的数据。
MongoDB 4.0是否涵盖此功能?
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()时指定这些选项:
读隔离(读取关注点):MongoDB多文档事务支持读取关注点“快照”、“本地”和“大多数”。
多文档事务支持读取首选项主要,并且给定事务中的所有操作必须路由到同一成员。
您可能还会对工程粉笔谈话:MongoDB事务视频感兴趣,其中包含有关MongoDB事务背后的一些技术解释。