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

news2025/4/22 4:15:52

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 持久化后,才标记事务为已提交,确保数据一致性‌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

upload-labs二次打

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

提权实战!

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

ChromeOS 135 版本更新

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

javaSE.Lambda表达式

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标,qt设置,可以在只启动HMI的时候隐藏光标,退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…

LangGraph——Agent AI的持久化状态

LangGraph 内置了一个持久化层,通过检查点(checkpointer)机制实现。当你使用检查点器编译图时,它会在每个超级步骤(super-step)自动保存图状态的检查点。这些检查点被存储在一个线程(thread)中,可在图执行后随时访问。由于线程允许在执行后访…

【双指针】专题:LeetCode 1089题解——复写零

复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法:双指针算法 先根据“异地”操…

【C++初学】C++核心编程(一):内存管理和引用

前言 在C的世界里,面向对象编程(OOP)是核心中的核心。它不仅是一种编程范式,更是一种思考问题的方式。本文将带你从C的内存分区模型出发,深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的…

(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载

源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板,该模板适用于滚屏网站模板、电气电力设备网站源码等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;PCWAP&#xff0c…