在 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
相关推荐
superman超哥36 分钟前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
熊的猫1 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
engchina1 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina1 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j
尘浮生2 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
威哥爱编程2 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
小华同学ai2 小时前
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
数据库·信息可视化·开源
Acrelhuang2 小时前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
十叶知秋3 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
瓜牛_gn4 小时前
mysql特性
数据库·mysql