当前位置: 首页 > article >正文

mongodb 4.0+多文档事务的实现原理

1. 副本集事务实现(4.0+)

  • 非严格依赖二阶段提交
    MongoDB 4.0 在副本集环境中通过 ‌全局逻辑时钟(Logical Clock)‌ 和 ‌快照隔离(Snapshot Isolation)‌ 实现多文档事务,事务提交时通过原子性协议(如 Raft 共识算法)协调副本集成员,而非传统 2PC 模式‌。
    事务提交时,主节点将事务操作日志(‌oplog 条目‌)广播至副本集成员。成员需通过 ‌多数派确认协议‌(类似 Raft 的日志复制机制)达成共识,确保日志持久化后才标记事务为已提交‌。
  • ACID 保障
    事务操作在提交时通过 WiredTiger 存储引擎的 MVCC(多版本并发控制)和日志持久化机制,确保原子性和持久性,且读操作基于一致性快照‌。

2. 分片集群事务实现(4.2+)

  • 依赖二阶段提交
    4.2 版本引入的分布式事务(跨分片操作)需通过 ‌两阶段提交协议‌ 协调多个分片:
    1. 准备阶段‌:各分片节点预提交事务并记录状态;
    2. 提交阶段‌:事务协调器确认所有分片就绪后,全局提交事务‌。
  • 扩展性优化
    通过减少跨节点锁竞争和优化状态管理,降低 2PC 对性能的影响,但跨分片事务仍存在更高的延迟‌

然而,MySQL 的 MVCC 机制 ‌会保留旧版本数据‌,但其实现方式与 MongoDB 存在显著差异。以下从底层设计、数据存储与清理角度解释其工作原理:

3. MVCC 的核心机制:undo log 与版本链
  • 旧版本数据存储方式
    MySQL InnoDB 引擎通过 ‌undo log(回滚日志)‌ 保留旧版本数据。每次更新操作时,原始数据会被复制到 undo log 中形成版本链,新数据直接写入主数据页‌13。
    示例:事务 A 修改某行数据时,该行原始值会被写入 undo log,新值更新到主数据页,形成两个版本。
  • 版本可见性规则
    事务通过 ‌Read View‌(一致性视图)判断可见性。每个事务启动时生成一个 Read View,记录当前活跃事务 ID 列表,仅能读取 ‌已提交且版本时间戳 ≤ 事务快照时间戳‌ 的数据‌。
  • 2. 旧版本数据的生命周期
  • 临时性保留
    旧版本数据仅在 ‌活跃事务需要访问‌ 时保留。例如,若事务 B 在事务 A 提交前启动,事务 B 需通过 undo log 读取事务 A 修改前的旧版本数据‌。
  • 自动清理机制
    InnoDB 后台的 ‌purge 线程‌ 会定期清理 ‌无活跃事务依赖的旧版本数据‌(如 undo log 中已提交且无其他事务引用的旧记录),避免长期堆积导致存储膨胀‌。
4. 用户感知的“未保留旧数据”现象
  • 快速清理与隐式存储
    由于 undo log 的设计,旧版本数据对用户透明(不直接体现在数据文件中),且清理效率高。用户通常感知不到旧版本的存在,误认为 MySQL 未保留旧数据‌。
  • 与 MongoDB 的差异
    MongoDB 的 WiredTiger 引擎通过 ‌显式版本链‌ 存储旧数据(如 B+ 树多版本节点),而 MySQL 依赖 ‌undo log 的日志结构‌ 实现版本管理,两者底层存储方式不同‌。
5. 示例场景说明
  1. 事务并发更新
    事务 A 更新某行数据 → 旧值写入 undo log,新值写入数据页。
    事务 B 在事务 A 提交前读取该行 → 通过 undo log 获取旧版本数据‌。
  2. 事务提交后清理
    事务 A 提交后,若系统中无其他事务依赖其旧版本数据,purge 线程会清理对应的 undo log 记录‌。

‌6. MongoDB 事务有没有像MySQL一样,实现WAL(Journal 日志) 和oplog 的二阶段提交?

因为Journal 和 oplog 没有能联系起来的标识位(xid).

6.1. WAL(Write-Ahead Logging)的作用
  • 存储引擎层持久化
    MongoDB 的 WiredTiger 存储引擎通过 WAL(Journal 日志) 实现数据持久化。所有事务操作会先写入 WAL 日志,确保在崩溃恢复时能通过重放日志恢复未提交的事务或已提交但未落盘的数据‌。
  • 检查点机制
    WiredTiger 定期(默认每分钟)创建检查点(Checkpoint),将内存中的脏页(Dirty Page)批量写入磁盘,并清理已持久化的 WAL 日志,减少恢复时间‌。
6.2. oplog 的副本集同步机制
  • 操作日志(oplog)的核心功能
    oplog 是 MongoDB 副本集的核心组件,记录所有数据变更操作(如插入、更新、删除)。事务提交时,主节点将事务内的操作打包为 ‌原子性 oplog 条目‌ 广播至副本集成员,成员通过重放 oplog 实现数据同步‌。
  • 原子性提交协议
    事务提交依赖 ‌多数派确认机制‌(类似 Raft 的日志复制流程),而非传统 2PC。主节点需等待多数副本集成员确认 oplog 持久化后,才标记事务为已提交,确保数据一致性‌。

相关文章:

mongodb 4.0+多文档事务的实现原理

1. 副本集事务实现(4.0)‌ ‌非严格依赖二阶段提交‌ MongoDB 4.0 在副本集环境中通过 ‌全局逻辑时钟(Logical Clock)‌ 和 ‌快照隔离(Snapshot Isolation)‌ 实现多文档事务,事务提交时通过…...

【论文阅读】UniAD: Planning-oriented Autonomous Driving

一、Introduction 传统的无人驾驶采用了区分子模块的设计,即将无人驾驶拆分为感知规划控制三个模块,这虽然能够让无人驾驶以一个很清晰的结构实现,但是感知的结果在传达到规划部分的时候,会导致部分信息丢失,这势必会…...

upload-labs二次打

1(前端js绕过) 弹窗,先看看有没有js有,禁用js 禁用后就可以上传php文件了,然后我们就去访问文件,成功 2(MIME绕过) 先上传一个php文件试试,不行,.htaccess不行, 试试MIME类型&am…...

Flutter命令行打包打不出ipa报错

Flutter打包ipa报错解决方案 在Flutter开发中,打包iOS应用时可能会遇到以下错误: error: exportArchive: The data couldn’t be read because it isn’ in the correct format. 或者 Encountered error while creating the IPA: error: exportArchive…...

网页制作中的MVC和MVT

MVC(模型-视图-控制器)和MVT(模型-模板-视图)是两种常见的软件架构模式,通常用于Web应用程序的设计。它们之间的主要区别在于各自的组件职责和工作方式。 MVC(模型-视图-控制器): 模…...

C. Good Subarrays

time limit per test 2 seconds memory limit per test 256 megabytes You are given an array a1,a2,…,ana1,a2,…,an consisting of integers from 00 to 99. A subarray al,al1,al2,…,ar−1,aral,al1,al2,…,ar−1,ar is good if the sum of elements of this subarra…...

聊天室项目day4(redis实现验证码期限,实现redis连接池)

1.redis连接池操作和之前所学过的io_context连接池原理一样这里不多赘述,也是创建多个连接,使用时按顺序取出来。 2.知识补充redisConnect()函数建立与 Redis 服务器的非阻塞网络连接,成功返回 redisContext*(连接上下文指针&…...

提交至git

通过 Pull Request 提交代码 如果你无法直接推送到 master 分支(例如,因为分支保护或权限限制),通常的做法是将代码推送到一个新分支,并通过 Pull Request(或 Merge Request)提交代码&#xff1…...

0x06.Redis 中常见的数据类型有哪些?

回答重点 Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。 String 字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。 使…...

如何查看自己 Android App 的私有数据?从 `adb backup` 到数据提取全过程

🛠️ 如何查看自己 Android App 的私有数据?从 adb backup 到数据提取全过程 📌 前言:作为一名 Android 开发者,我常常想知道自己写的 App 在用户设备上的数据存储结构是怎样的,比如有没有数据写入成功、有…...

提权实战!

就是提升权限,当我们拿到一个shell权限较低,当满足MySQL提权的要求时,就可以进行这个提权。 MySQL数据库提权(Privilege Escalation)是指攻击者通过技术手段,从低权限的数据库用户提升到更高权限&#xff…...

Vue使用el-table给每一行数据上面增加一行自定义合并行

// template <template><el-table:data"flattenedData":span-method"objectSpanMethod"borderclass"custom-header-table"style"width: 100%"ref"myTable":height"60vh"><!-- 订单详情列 -->&l…...

ChromeOS 135 版本更新

ChromeOS 135 版本更新 一、ChromeOS 135 更新内容 1. ChromeOS 电池寿命优化策略 为了延长 Chromebook 的使用寿命&#xff0c;ChromeOS 135 引入了一项全新的电池充电限制策略 —— DevicePowerBatteryChargingOptimization&#xff0c;可提供更多充电优化选项&#xff0c…...

国内协作机器手焊接领域领军人物分析

国内焊接协作机器手领域的专家涵盖学术界与产业界,他们在核心技术研发、行业标准制定及重大工程应用中发挥关键作用。以下从技术方向、行业贡献、典型案例三个维度展开分析: 一、学术界领军人物:理论创新与技术突破 1. 吴林(哈尔滨工业大学) 学术地位:中国焊接学会名誉…...

javaSE.Lambda表达式

如果一个接口中有且只有一个待实现的抽象方法&#xff0c;那么我们可以将匿名内部类简写为Lambda表达式。 简写规则 标准格式&#xff1a; &#xff08;【参数类型 参数名称&#xff0c;】...&#xff09; -> {代码语句&#xff0c; 包括返回值} 只有一行花括号{}可以省略。…...

【随身wifi】青龙面板保姆级教程

0.操作前必看 本教程基于Debian系统&#xff0c;从Docker环境。面板安装&#xff0c;到最后拉取脚本的使用。 可以拉库跑狗东京豆&#xff0c;elm红包等等&#xff0c;也可以跑写自己写的脚本&#xff0c;自行探索 重要的号别搞&#xff0c;容易黑号&#xff0c;黑号自己负责…...

Android 之美国关税问题导致 GitHub 403 无法正常访问,责任在谁?

这几天各国关税问题导致世界动荡不安&#xff0c;如今GitHub又无法正常访问&#xff0c;是不是Google到时候也无法正常使用了。...

深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作

在 Android 应用开发中&#xff0c;流畅的 UI 渲染是用户体验的核心。但你是否好奇&#xff0c;一个简单的 View 是如何从代码中的 onDraw() 方法一步步变成屏幕上的像素的&#xff1f;本文将从底层图形系统的视角&#xff0c;解析 Android 中 Canvas、Skia、OpenGL ES 和 Surf…...

4月13日星期日早报简报微语报早读

4月13日星期日&#xff0c;农历三月十六&#xff0c;早报#微语早读。 1、北京处置倒伏树木843棵&#xff0c;已全部处置完毕&#xff1b; 2、山西大同“订婚强奸案”本月16日二审宣判&#xff0c;一审男方被判3年刑&#xff1b; 3、今年我国快递业务量已突破500亿件&#xf…...

动态路由, RIP路由协议,RIPv1,RIPv2

动态路由 1、回顾 路由&#xff1a;从源主机到目标主机的过程 源主机发送数据给目标主机&#xff0c;源主机会查看自身的路由信息 如果目标主机是自己同网段&#xff0c;源主机查看的是直连路由 如果目标主机和自己不同网段&#xff0c;源主机查看的是静态路由、动态路由、默…...

【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测

基于穿戴装备的身体活动监测 摘要 本研究基于加速度计采集的活动数据&#xff0c;旨在分析和统计100名志愿者在不同身体活动类别下的时长分布。通过对加速度数据的处理&#xff0c;活动被划分为睡眠、静态活动、低强度、中等强度和高强度五类&#xff0c;进而计算每个志愿者在…...

212、【图论】字符串接龙(Python)

题目描述 题目链接&#xff1a;110. 字符串接龙 代码实现 import collectionsn int(input()) beginStr, endStr input().split() strList [input() for _ in range(n)]deque collections.deque() # 使用队列遍历结点 deque.append([beginStr, 1]) # 存储当前字符串和遍…...

车载以太网-TLS

文章目录 车载以太网与TLS的技术背景核心定位车载以太网TLS的技术架构车载TLS的核心安全机制TLS报文结构详解TLS工作机制密钥交换与计算流程标题完整握手流程(1-RTT)数据传输加密流程车载TLS的独特优化策略车载TLS的安全威胁相关标准车载以太网TLS(Transport Layer Security…...

大模型面经 | 手撕多头注意力机制(Multi-Head Attention)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

02_位掩码逻辑及Java示例

文章目录 一、位掩码核心逻辑二、Java示例&#xff1a;权限管理‌三、关键点解析‌四、优缺点分析‌五、适用场景 位掩码&#xff08;Bitmask&#xff09;是一种利用二进制位进行状态管理的技术&#xff0c;通过位运算高效处理多个布尔标志。 一、位掩码核心逻辑 ‌基本概念‌…...

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 四、行军线效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGam…...

GO语言-数据类型

文章目录 变量定义1. 整数类型2. 浮点类型3. 字符类型4. 布尔类型5. 字符串类型5.1 字符串的本质5.2 常用字符串处理函数(strings包)5.3 修改字符串的方式 6. 数据默认值7. 类型转换 变量定义 代码如下&#xff1a; package mainimport "fmt"var i1 1000 var i2 i…...

低资源需求的大模型训练项目---3、综合对比与选型建议

综合对比与选型建议 1. Qwen2.5-0.5B 适用性分析&#xff1a; • 优势&#xff1a; • 工业级全流程支持&#xff1a;阿里云提供了完整的预训练、微调、强化学习&#xff08;RLHF&#xff09;代码和文档&#xff0c;支持从数据处理到模型部署的全链路实践。 • 性能与场景适配…...

设计模式 四、行为设计模式(2)

五、状态模式 1、概述 状态设计模式是一种行为型设计模式&#xff0c;它允许对象在其内部状态发生时改变其行为&#xff0c;这种模式可以消除大量的条件语句&#xff0c;并将每个状态的行为封装到单独的类中。 状态模式的主要组成部分如下&#xff1a; 1&#xff09;上…...

FEA 仿真助力高速连接器设计中的信号完整性

各行各业高速信号软件和硬件的快速发展&#xff0c;带来了更高的频率和带宽。因此&#xff0c;对连接器组件的整体性能要求也更加严格。同时&#xff0c;器件和封装形式、互连以及系统内其他设备的小型化也带来了额外的设计挑战。所有这些都对信号传输完整性产生重大影响。 高速…...