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

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)‌ 实现多文档事务,事务提交时通过…...

decompiled.class file bytecode version50(java 6)

idea运行项目报错,跳到具体的.class中,idea会给出提示下载源码,点击下载报错,具体报错信息我没记录了(反正就是无法看到源码) 解决方式: 1、网上说下载scala插件,重启idea即可 但是…...

CSS 列表样式学习笔记

CSS 列表样式提供了强大的功能,用于定制 HTML 列表的外观。通过 CSS,可以轻松地改变列表项的标记类型、位置,甚至使用图像作为列表项标记。以下是对 CSS 列表样式的详细学习笔记。 一、HTML 列表类型 在 HTML 中,主要有两种类型…...

linux网络设置

ifconfig 查看ip地址 查看当前的liunx系统的网络参数ip地址 Ubuntu需要安装 Apt install -y net-tools 查看网络信息 Ifconfig 只能看到开启的网卡 Ifconfig -a 看到所有的网卡包括开启和关闭的 Ifconfig 网卡名称 up 开启网卡 Ifconfig 网卡名称 down 关闭网卡 If…...

抗干扰CAN总线通信技术在分布式电力系统中的应用

摘要:随着分布式电力系统的广泛应用,其通信系统的可靠性与稳定性受到了前所未有的挑战。CAN总线通信技术以其卓越的抗干扰性能和可靠性,在众多通信技术中脱颖而出,成为解决分布式电力系统通信问题的关键。本文深入剖析了CAN总线通…...

Maven工具学习使用(十二)——extension和depency的区别

在 Maven 中,extensions 和 dependencies 是两个不同的概念,它们在项目构建和依赖管理中扮演着不同的角色。 1、Dependencies dependencies 是 Maven 项目中用于管理项目所需的库和模块的部分。这些依赖可以是本地仓库中的,也可以是远程仓库…...

Python学生信息查询

利用字典设置学生信息,将这些信息放入列表中进行存储,根据输入的姓名查询展示对应的学生信息。 Student1{no:202001,name:zyt,score:87} Student2Student1.copy() Student3Student2.copy()Student2[no]202002 Student3[no]202003Student2[name]zwh Stud…...

一天时间,我用AI(deepseek)做了一个配色网站

前言 最近在开发颜色搭配主题的相关H5和小程序,想到需要补充一个web网站,因此有了这篇文章。 一、确定需求 向AI要答案之前,一定要清楚自己想要做什么。如果你没有100%了解自己的需求,可以先让AI帮你理清逻辑和思路,…...

MQ(消息队列)体系详解

消息队列(MQ,Message Queue) 是一种基于消息传递的异步通信机制,用于不同系统、服务之间进行数据传递和交互。它通常用来解耦生产者和消费者,提供高可用、高吞吐量和可靠的消息传递。 一、消息队列用途 1.系统解耦 …...

【GESP真题解析】第 3 集 GESP一级样题卷编程题 2:闰年求和

大家好,我是莫小特。 这篇文章给大家分享 GESP 一级样题卷编程题第 2 题:闰年求和。 题目链接 洛谷链接:B3846 闰年求和 一、完成输入 根据题目要求,我们需要输入两个整数,分别表示起始年份和终止年份。 要求计算…...

Windows Server 2019 安装 Docker 完整指南

博主本人使用的是离线安装 1. 安装前准备 系统要求 操作系统:Windows Server 2019(或 2016/2022)权限:管理员权限的 PowerShell网络:可访问互联网(或离线安装包) 启用容器功能 Install-Win…...

JetBrains PhpStorm v2024.3.1 Mac PHP开发工具

JetBrains PhpStorm v2024.3.1 Mac PHP开发工具 一、介绍 JetBrains PhpStorm 2024 mac,是一款PHP开发工具,直接开始编码,无需安装和配置大量插件。PhpStorm 从一开始就已包含 PHP、JavaScript 和 TypeScript 开发所需的一切,还…...

机器学习(ML)在AI驱动测试通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。

机器学习(ML)在AI驱动测试中扮演着 核心引擎 的角色,通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。以下是机器学习在测试各环节的具体作用及实现方案: 一、机器学习在测试生命周期中的作用 #mermaid-svg-u4vgPE6O2jugiZFB {font-family:"trebuchet ms&qu…...

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

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

本地缓存方案Guava Cache

Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案&#xff0c;适用于需要快速访问且不频繁变更的数据。 // 普通缓存 Cache<Key, Value> cache CacheBuilder.newBuilder().maximumSize(1000) // 最大条目数.expireAfterWrite(10, TimeUnit.MINUTES) /…...

A Causal Inference Look at Unsupervised Video Anomaly Detection

标题&#xff1a;无监督视频异常检测的因果推断视角 原文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/20053 发表&#xff1a;AAAI-2022 文章目录 摘要引言相关工作无监督视频异常检测因果推断 方法问题公式化一般设置强基线模型 无监督视频异常检测的因…...

MQ(RabbitMQ.1)

MQ的含义及面试题 MQMQ的含义MQ之间的调用的方式MQ的作用MQ的几种产品RabbitMQRabbitMQ的安装RabbitMQ的使用RabbitMQ⼯作流程 AMQPWeb界面操作用户相关操作虚拟主机相关操作 RabbitMQ的代码应用编写生产者代码编写消费者代码 生产者代码消费者代码 MQ MQ的含义 MQ&#xff0…...

cursor+高德MCP:制作一份旅游攻略

高德开放平台 | 高德地图API (amap.com) 1.注册成为开发者 2.进入控制台选择应用管理----->我的应用 3.新建应用 4.点击添加Key 5.在高德开发平台找到MCP的文档 6.按照快速接入的步骤&#xff0c;进行操作 一定要按照最新版的cursor, 如果之前已经安装旧的版本卸载掉重新安…...

FPGA时序分析与约束(11)——时钟组

目录 一、同步时钟与异步时钟 二、逻辑与物理独立时钟 2.1 逻辑独立时钟 2.2 物理独立时钟 三、如何设置时钟组 四、注意事项 专栏目录&#xff1a; FPGA时序分析与约束&#xff08;0&#xff09;——目录与传送门https://ztzhang.blog.csdn.net/article/details/134893…...

opencv 识别运动物体

import cv2 import numpy as npcap cv2.VideoCapture(video.mp4) try:import cv2backSub cv2.createBackgroundSubtractorMOG2() except AttributeError:backSub cv2.bgsegm.createBackgroundSubtractorMOG()#形态学kernel kernel cv2.getStructuringElement(cv2.MORPH_REC…...

opencv实际应用--银行卡号识别

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;主要用于图像和视频处理、目标检测、特征提取、3D重建以及机器学习任务。它支持多种编程语言&#xff08;如C、Python&#xff09;&#xff0c;提供丰富的算法和工具&a…...

【软考系统架构设计师】系统架构设计知识点

1、 从需求分析到软件设计之间的过渡过程称为软件架构。 软件架构为软件系统提供了一个结构、行为和属性的高级抽象&#xff0c;由构件的描述、构件的相互作用&#xff08;连接件&#xff09;、指导构件集成的模式以及这些模式的约束组成。 软件架构不仅指定了系统的组织结构和…...

GPT - 2 文本生成任务全流程

数据集下载 数据预处理 import json import pandas as pdall_data []with open("part-00018.jsonl",encoding"utf-8") as f:for line in f.readlines():data json.loads(line)all_data.append(data["text"])batch_size 10000for i in ran…...

重返JAVA之路——面向对象

目录 面向对象 1.什么是面向对象&#xff1f; 2.面向对象的特点有哪些&#xff1f; 3.什么是对象&#xff1f; 4.什么是类&#xff1f; 5.什么是构造方法? 6.构造方法的特性有哪些&#xff1f; 封装 1.什么是封装&#xff1f; 2.封装有哪些特点&#xff1f; 数据隐…...

docker 安装 jenkins

拉取镜像 docker pull jenkins/jenkins:2.426.3-lts-jdk17 创建数据卷 # 创建时即设置安全权限&#xff08;SGID确保组权限继承&#xff09; sudo mkdir -p /var/jenkins_home sudo chmod -R 777 /var/jenkins_home 拉取镜像并运行容器 # 生产环境推荐&#xff08;JDK17…...

sql 向Java的映射

优化建议&#xff0c;可以在SQL中控制它的类型 在 MyBatis 中&#xff0c;如果返回值类型设置为 java.util.Map&#xff0c;默认情况下可以返回 多行多列的数据...

探索Streamlit在测试领域的高效应用:文档读取与大模型用例生成的完美前奏

大模型用例生成前置工作之文档读取——构建你的自动化测试基础 在群友的极力推荐下&#xff0c;开始了streamlit的学习之旅。本文将介绍如何使用Streamlit开发一个多功能文档处理工具&#xff0c;支持读取、预览、格式转换和导出多种测试相关文档&#xff08;YAML、JSON、DOCX…...

Python中数值计算、表格处理和可视化的应用

1.数值计算&#xff1a;Numpy import numpy as np 1.1创建数组 import numpy as np arr1 np.array([[1,2,3,4,5]]) print(arr1) print(type(arr1)) print("数组形状",arr1.shape) arr2 np.array([[1,2,3],[2,3,4]]) print(arr2) print(type(arr1)) print("…...

【数据可视化艺术·实战篇】视频AI+人流可视化:如何让数据“动”起来?

景区游玩&#xff0c;密密麻麻全是人&#xff0c;想找个拍照的好位置都难&#xff1b;上下班高峰挤地铁&#xff0c;被汹涌的人潮裹挟着&#xff0c;只能被动 “随波逐流”。这样的场景&#xff0c;相信很多人都再熟悉不过。其实&#xff0c;这些看似杂乱无章的人群流动现象&am…...

038-flatbuffers

flatbuffers FlatBuffers技术调研报告 一、核心原理与优势 FlatBuffers通过内存直接访问技术实现零拷贝序列化&#xff0c;其核心优势如下&#xff1a; 内存布局&#xff1a;数据以连续二进制块存储&#xff0c;包含VTable&#xff08;虚拟表&#xff09;和Data Object&…...

探索 Go 与 Python:性能、适用场景与开发效率对比

1 性能对比&#xff1a;执行速度与资源占用 1.1 Go 的性能优势 Go 语言被设计为具有高效的执行速度和低资源占用。它编译后生成的是机器码&#xff0c;能够直接在硬件上运行&#xff0c;避免了 Python 解释执行的开销。 以下是一个用 Go 实现的简单循环计算代码&#xff1a; …...

Pinia最基本用法

1. 定义 Store 首先&#xff0c;定义一个 Pinia Store&#xff0c;使用组合式 API 风格和 ref 来管理状态。 示例&#xff1a;stores/ids.js import { defineStore } from pinia; import { ref } from vue;export const useIdsStore defineStore(ids, () > {const ids …...

MySQL中的UNION和UNION ALL【简单易懂】

一、前言 UNION 和 UNION ALL 是 SQL 中用于合并多个查询结果集的关键字。 二、核心作用 两者均用于将多个 SELECT 语句的结果集纵向合并&#xff08;列结构需相同&#xff09;&#xff0c;但行为存在关键差异&#xff1a; 三、使用场景对比 需要去重时&#xff1a;例如合并…...

ConcurrentHashMap 源码分析

摘要 介绍线程安全集合类 ConcurrentHashMap 源码&#xff0c;包括扩容&#xff0c;协助扩容&#xff0c;红黑树节点读写线程同步&#xff0c;插入元素后累加键值对数量操作原子性实现。 1 成员变量及其对应的数据结构 底层由数组红黑树链表实现volatile long baseCount 和 v…...

一种基于学习的多尺度方法及其在非弹性碰撞问题中的应用

A learning-based multiscale method and its application to inelastic impact problems 摘要&#xff1a; 我们在工程应用中观察和利用的材料宏观特性&#xff0c;源于电子、原子、缺陷、域等多尺度物理机制间复杂的相互作用。多尺度建模旨在通过利用固有的层次化结构来理解…...

【DE2-115】Verilog实现DDS+Quartus仿真波形

【DE2-115】Verilog实现DDSQuartus仿真波形 一、任务要求二、实现步骤2.1 相位累加器2.2 波形存储器ROM2.2.1 方波模块2.2.2 正弦波形存储器 2.3 3锁相环倍频电路2.4 顶层电路设计 三、设计实现四、实验总结 一、任务要求 采用数字频率合成&#xff08;Direct Digital Frequen…...

StickyNotes,简单便签超实用

日常工作中是不是经常需要记点东西&#xff0c;但又不想用太复杂的工具&#xff1f;今天给你推荐一款超简单的桌面便签软件——StickyNotes。 下面是动图&#xff1a; 简单到极致的便签工具 StickyNotes真的是简单到不能再简单了。打开软件&#xff0c;直接输入你的便签内容&a…...

深度探索 C 语言:指针与内存管理的精妙艺术

C 语言作为一门历史悠久且功能强大的编程语言&#xff0c;以其高效的性能和灵活的底层控制能力&#xff0c;在计算机科学领域占据着举足轻重的地位。 指针和内存管理是 C 语言的核心特性&#xff0c;也是其最具挑战性和魅力的部分。深入理解指针与内存管理&#xff0c;不仅能够…...

【C++】深拷贝与浅拷贝

重开也不是不可能 ~.~ 浅拷贝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 构造函数&#xff0c;初始化指针成员ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…...

【3】k8s集群管理系列--包应用管理器helm之chart资源打包并推送到harbor镜像仓库

一、chart资源打包 helm package ./web-chart # 当前目录会生成一个tgz的压缩文件二、安装help push插件&#xff08;用于推送前面打包的文件&#xff0c;到镜像仓库&#xff09; .1 下载help-push二进制文件 wget https://github.com/chartmuseum/helm-push/releases/down…...

React与Vue:选择哪个框架入门?

React与Vue&#xff1a;选择哪个框架入门&#xff1f; 作为前端开发者&#xff0c;我在React和Vue两个框架间切换多次&#xff0c;常被新手问到应该从哪个入手。不同于网上那些详尽的技术比较&#xff0c;这里我想从实用角度给你一个简明对比。 两大框架核心差异 特性ReactV…...

pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9

在 PyCharm 中&#xff0c;如果你已经安装了 Python 3.9&#xff0c;并且希望在 Run Configurations 中新增一个 Python 3.9 的解释器&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;打开 PyCharm 设置 点击 PyCharm 左上角的 File 菜单。选择 Settings&am…...

STL之迭代器(iterator)

迭代器的基本概念 迭代器(iterator)模式又称为游标(Cursor)模式&#xff0c;用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解&#xff1a;Iterator模式是运用于聚合对象的一种模式&#xff0c;通过运用该模式&#…...

Mysql5.7配置文件

Mysql5.7配置文件 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 使用utf8mb4而不是utf8&#xff1a; https://blog.csdn.net/omaidb/article/details/106481406 https://blog.csdn.net/fdipzo…...

HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步

作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…...

【HarmonyOS 5】敏感信息本地存储详解

【HarmonyOS 5】敏感信息本地存储详解 前言 鸿蒙其实自身已经通过多层次的安全机制&#xff0c;确保用户敏感信息本地存储安全。不过再此基础上&#xff0c;用户敏感信息一般三方应用还需要再进行加密存储。 本文章会从鸿蒙自身的安全机制进行展开&#xff0c;最后再说明本地…...

0x03.Redis 通常应用于哪些场景?

回答重点 1)缓存(Cache): Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。例如,常用的用户会话数据和页面渲染结果可以存储在 Redis 中。2)分布式锁(Distributed Lock): Redis 可以用作分布式锁的实现,确保在分布式系统中资源的安全访问,避免…...

Keil创建自定义的STM32标准库工程

注&#xff1a;以下工程创建将以STM32F103ZET6为例 1 下载需要的资料包 1.1 下载 Keil 的 STM32F103 芯片支持包 1.1.1 手动下载安装包 Keil官网&#xff1a;https://www.keil.com/ &#xff08;1&#xff09;进入官网&#xff0c;点击 Download。 &#xff08;2&#xf…...

React(1)基础入门

React(1)基础入门 Author: Once Day Date: 2025年4月10日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: FullStack开发_Once-Day的博客-CSDN博客 …...

Mysql8配置文件

Mysql8配置文件 修改my.cnf----配置持久化键(persistence key)配置表名不区分大小写 修改my.cnf----配置持久化键(persistence key) MySQL8初始化数据库之前配置好这些变量值&#xff0c;初始化数据库之后可能无法修改这个值。 # 服务端配置 [mysqld] ######## 数据目录和基…...