在 Node.js 中使用 MongoDB 事务

MongoDB事务

事务介绍

在 MongoDB 中,对单个文档的操作是原子的。由于您可以使用嵌入的文档和数组来捕获单个文档结构中的数据之间的关系,而不是跨多个文档和集合进行规范化,因此这种单一文档的原子性消除了对多文档的需求许多实际用例的事务。

对于需要对多个文档(在单个或多个集合中)进行读取和写入原子化的情况,MongoDB 支持多文档事务。对于分布式事务,事务可用于多个操作、集合、数据库、文档和分片。

事务和原子性

分布式事务和多单据事务 从 MongoDB 4.2 开始,这两个术语是同义词。分布式事务是指分片群集和副本集上的多文档交易记录。多文档事务(无论是在分片群集还是副本集上)也称为从 MongoDB 4.2 开始的分布式事务。 对于需要对多个文档(在单个或多个集合中)进行读取和写入原子化的情况,MongoDB 支持多文档事务:

在版本 4.0中,MongoDB 支持副本集上的多文档事务。

在版本 4.2中,MongoDB 引入了分布式事务,这增加了对分片群集上的多文档事务的支持,并合并了对副本集上多文档事务的现有支持。

要在 MongoDB 4.2 部署(副本集和分片群集)上使用事务,客户端必须使用为 MongoDB 4.2 更新的 MongoDB 驱动程序。

多文档事务是原子的(即提供"全无"命题):

当事务提交时,事务中所做的所有数据更改都将保存在事务外部并可见。也就是说,事务不会提交其某些更改,而回滚其他更改。

在事务提交之前,事务中所做的数据更改在事务外部不可见。

但是,当事务写入多个分片时,并非所有外部读取操作都需要等待提交的事务的结果在分片中可见。例如,如果提交事务,写入 1 在分片 A 上可见,但在分片 B 上尚未显示写入 2,则读取时的外部读取"local"可以读取写入 1 的结果,而看不到写入 2。

当事务中止时,事务中所做的所有数据更改将被丢弃,而不会变得可见。例如,如果事务中的任何操作失败,事务将中止,并且事务中所做的所有数据更改将被丢弃,而不会变得可见。

准备工作

MongoDB 使用事务的前提是 MongoDB 版本大于 4.0,需要配置 MongoDB 工作模式为副本集,单个 MongoDB 节点不足支持事务,因为 MongoDB 事务至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。mongodb各个节点常见的搭配方式为:一主一从、一主多从。主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

部署 功能 兼容性版本
副本集 4.0
分片集群 4.2
链接:https://juejin.cn/post/6844904089612992520
相关推荐
Hello.Reader26 分钟前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯28 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
yanglamei196238 分钟前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
工作中的程序员1 小时前
ES 索引或索引模板
大数据·数据库·elasticsearch
严格格1 小时前
三范式,面试重点
数据库·面试·职场和发展
又写了一天BUG1 小时前
npm install安装缓慢及npm更换源
前端·npm·node.js
微刻时光1 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
单字叶2 小时前
MySQL数据库
数据库·mysql
mqiqe2 小时前
PostgreSQL 基础操作
数据库·postgresql·oracle
just-julie2 小时前
MySQL面试题——第一篇
数据库·mysql