MongoDB 8.0——事务
事务1、事务基础原理2、驱动程序API2.1、回调API2.2、核心API2.3、事务错误处理2.3.1、TransientTransactionError2.3.2、UnknownTransactionCommitResult2.3.3、TransactionTooLargeForCache3、事务与操作3.1、事务操作基础3.2、在事务中创建集合和索引3.3、计数 限制性与去重操作4、读取偏好与读写关注4.1、事务和读取偏好4.2、事务和读关注4.3、事务和写关注事务是传统数据库所具备的一项基本能力其根本目的是为数据的可靠性和一致性提供保障。在通常的实现中事务包含一个系列的数据库读写操作这些操作要么全部完成要么全部撤销。例如在电子商城场景中当顾客下单购买某件商品时除生成订单外还应该同时扣减商品的库存这些操作应该被作为一个整体的执行单元进行处理否则会产生数据不一致的情况。在MongoDB数据库中对单个文档的操作具有原子性。因为在单个文档结构中使用内嵌文档和数据可以获得数据之间的关系所以不必跨多个文档和集合进行范式化这种结构特性避免了在大多数场景中对多文档事务的需求。1、事务基础原理MongoDB数据支持对多个文档无论是单个集合还是多个集合的读写操作具有原子性并且支持多文档分布式的事务。利用分布式事务可以跨多个操作、集合、数据库、文档和分片执行事务。在下面的代码示例中将重点介绍事务API的关键组件其使用了回调API。回调API主要包括以下步骤步骤1启动事务。步骤2执行指定操作。步骤3提交结果或在出错时中止​。注意回调API包含特定错误的重试逻辑。示例代码如下上述代码的解释参见代码中的注释这里就不展开了。MongoDB数据库的事务和原子性支持对多个文档无论是单个集合还是多个集合进行原子性读取和写入的情况。MongoDB支持分布式事务包括副本集和分片集群上的事务。关于分布式事务的原子性说明如下事务要么应用所有数据更改要么回滚(Callback)更改。在提交事务时事务中所进行的所有数据更改都会保存并且在事务之外可见。在提交事务前在事务中所进行的数据更改在事务外不可见。不过当事务写入多个分片时并非所有外部读取操作都需等待已提交事务的结果在各个分片上可见。当事务中止后在事务中所进行的所有数据更改都会被丢弃并且不会变得可见。事务中的任何操作失败事务都会中止事务中所进行的所有数据更改将被丢弃并且不会变得可见。在大多数情况下与单文档写入操作相比分布式事务会产生更高的性能成本并且分布式事务的可用性不应取代有效的模式设计。在许多情况下非规范化数据模型嵌入式文档和数组仍然是数据和使用案例的最佳选择。换言之对于许多场景适当的数据建模将最大限度地减少对分布式事务的需求。2、驱动程序APIMongoDB数据库事务的驱动程序API主要包括回调(Callback)API、核心(Core)API以及事务错误处理等方面的内容。2.1、回调APIMongoDB数据库的回调API(Callback API)的主要功能是启动事务、执行指定操作并提交或在出错时中止​。回调API自动包含TransientTransactionError和UnknownTransactionCommitResult的错误处理逻辑。回调API主要包含以下逻辑如果事务遇到TransientTransactionError错误则将事务作为一个整体进行重试。如果提交操作遇到UnknownTransactionCommitResult错误则重试提交操作。从MongoDB 6.2版本开始服务器在收到TransactionTooLargeForCache错误时不会重试事务。在下面的代码示例中使用新的回调API来处理事务具体操作是启动事务、执行指定操作并提交或在出错时中止​。新的回调API包含针对TransientTransactionError或UnknownTransactionCommitResult提交错误的重试逻辑。具体代码如下有关上述代码的说明可参见代码中的注释。2.2、核心APIMongoDB数据库的核心API的主要功能是需要显式调用以启动并提交事务。核心API不包含对TransientTransactionError和UnknownTransactionCommitResult的错误处理逻辑而是提供对这些错误进行自定义错误处理的灵活性。核心API不包含标记为以下错误的重试逻辑。TransientTransactionError如果事务中的操作返回标记为TransientTransactionError的错误则可以将事务作为一个整体进行重试。如果要处理TransientTransactionError则应用程序应显式包含该错误的重试逻辑。UnknownTransactionCommitResult如果提交返回标记为UnknownTransactionCommit Result的错误则可以重试提交。如果要处理UnknownTransactionCommitResult则应用程序应显式包含该错误的重试逻辑。在下面的代码示例中包含在出现暂时性错误时重试事务的逻辑以及在出现未知提交错误时重试提交的逻辑。如果要将读取和写入操作与事务关联则必须将会话传递给事务中的每个操作。具体代码如下2.3、事务错误处理无论是哪种数据库系统包括非关系数据库或关系数据库​应用程序都应采取相应措施来处理事务提交期间的错误并包含事务的重试逻辑。2.3.1、TransientTransactionError无论retryWrites的值如何事务中的单独写入操作均不可重试。如果操作遇到与标签相关的TransientTransactionError错误例如主节点降级时​可以将事务作为一个整体进行重试。回调API包含TransientTransactionError错误的重试逻辑。核心事务API不包含TransientTransactionError的重试逻辑。如果要处理TransientTransactionError则应用程序应显式包含错误的重试逻辑。2.3.2、UnknownTransactionCommitResult提交操作是可以重试写入操作的。如果提交操作遇到错误那么无论retryWrites的值如何MongoDB驱动程序都会重试提交。如果提交操作遇到标记为UnknownTransactionCommitResult的错误则可以重试提交。回调API包含UnknownTransactionCommitResult的重试逻辑。核心事务API不包含UnknownTransactionCommitResult的重试逻辑如果要处理UnknownTransactionCommitResult则应用程序应显式包含错误的重试逻辑。2.3.3、TransactionTooLargeForCache从MongoDB 6.2版本开始服务器在收到TransactionTooLargeForCache错误后不会重试事务。此错误意味着缓存过小重试可能会失败。TransactionTooLargeForCacheThreshold阈值的默认值为0.75当事务使用超过75%的缓存时服务器会返回TransactionTooLargeForCache而不是重试事务。在MongoDB的早期版本中服务器会返回TemporarilyUnavailable或WriteConflict而不是TransactionTooLargeForCache。在下面的mongosh代码示例中主要省略了重试逻辑和强大的错误处理功能。具体代码如下3、事务与操作MongoDB数据库可以在跨多个操作、集合、数据库、文档和分片上使用分布式事务具体内容如下。3.1、事务操作基础MongoDB数据库在事务中创建集合和索引如果事务不是跨分片写入事务则可以在分布式事务中执行创建集合的操作并在先前同一事务中创建的新空集合上创建索引。对于MongoDB事务操作而言主要包含以下几方面的内容可以在事务中创建集合和索引。事务中使用的集合可以位于不同的数据库中。注意设计人员无法在跨分片写事务中创建新集合。不能写入固定大小集合。从固定大小集合读取时不能使用读关注snapshot从MongoDB 5.0版本开始​。不能在config、admin或local数据库中读取/写入集合。不能写入system.*集合。不能使用explain或类似命令返回受支持操作的查询计划。对于在ACID事务外部创建的游标无法在ACID事务内部调用getMore。对于在事务中创建的游标无法在事务外部调用getMore。不能将killCursors指定为事务中的第一个操作。3.2、在事务中创建集合和索引在MongoDB事务中创建集合时可以隐式创建一个集合。例如对不存在的集合进行插入操作或对不存在的集合使用upsert: true进行update/findAndModify操作。同时可以使用create命令或其辅助程序db.createCollection()显式创建集合。同时创建集合和索引有如下几项限制。无法在跨分片写事务中创建新集合。例如如果在一个分片中写入一个现有集合并在另一个分片中隐式创建一个集合MongoDB将无法在同一事务中执行这两个操作。当以分片集合为目标时无法在事务中使用$graphLookup阶段。如果要在事务中显式创建集合或索引则事务读关注级别必须为local。3.3、计数 限制性与去重操作如果要在MongoDB事务中执行计数操作可以使用$count聚合阶段或$group带有$sum表达式聚合阶段。MongoDB驱动程序提供集合级API方法countDocuments(filter, options)作为辅助方法该方法使用$group和$sum表达式来执行计数。mongosh工具提供db.collection.countDocuments()辅助方法该方法使用$group和$sum表达式进行计数。如果要在事务中执行不同的操作对于未分片的集合可以使用db.collection.distinct()方法、distinct命令以及带有$group阶段的聚合管道。对于分片集合不能使用db.collection.distinct()方法或distinct命令。如果要查找分片集合的不同值可以改用带有$group阶段的aggregation pipeline。例如不使用db.coll.distinct(“x”)而是使用如下方法不使用db.coll.distinct(“x”, { status: “A” })而是使用如下方法管道返回一个指向文档的游标{distinctValues:[2,3,1]}以上迭代游标用于访问结果文档。MongoDB事务中有几项限制性操作具体内容如下在跨分片写事务中创建新集合。例如如果在一个分片中写入一个现有集合并在另一个分片中隐式创建一个集合那么MongoDB将无法在同一事务中执行这两项操作。使用local以外的读关注级别时显式创建集合例如db.createCollection()方法和索引例如db.collection.createIndexes()和db.collection.createIndex()方法​。listCollections和listIndexes命令及其辅助方法。其他非CRUD和非信息性操作例如createUser、getParameter和count及其辅助程序。4、读取偏好与读写关注4.1、事务和读取偏好MongoDB数据库事务中的操作使用事务级读取偏好。通过使用驱动程序设计人员可以在事务启动时设置事务级读取偏好具体内容如下如果未设置事务级别的读取偏好则事务将使用会话级别的读取偏好。如果未设置事务级别和会话级别的读取偏好则事务将使用客户端级别的读取偏好。默认情况下客户端级别的读取偏好为primary。包含读取操作的分布式事务必须使用读取偏好primary。给定事务中的所有操作都必须路由到同一节点。4.2、事务和读关注MongoDB数据库事务中的操作使用事务级读关注也就是在集合和数据库级别设置的任何读关注在事务中都会被忽略。设计人员可以在事务启动时设置事务级别的读关注具体内容如下如果未设置事务级别的读关注则事务级别的读关注默认为会话级别的读关注。如果未设置事务级的读关注和会话级的读关注则事务级的读关注默认为客户端级的读关注。默认情况下对于主节点上的读取客户端级的读关注是local。关于MongoDB数据库事务支持的读关注级别具体内容介绍如下。local读关注local返回节点中可用的最新数据但可以回滚。在副本集上即使事务使用读关注local也可能会观察到更强的读隔离性其中该操作从事务打开时的快照中读取。对于分片集群上的事务读关注local无法保证数据来自跨分片的同一快照视图。可以在事务中创建集合和索引。如果显式创建集合或索引则事务必须使用读关注local。如果隐式创建集合则可以使用任何可用于事务的读关注。majority如果事务以写关注majority提交则读关注majority返回已被多数副本集节点确认且无法回滚的数据。否则读关注majority不保证读取操作会读取多数副本集中所提交的数据。对于分片集群上的事务读关注majority无法保证数据来自跨分片的同一快照视图。snapshot如果事务使用写关注majority提交则读关注snapshot会从多数已提交数据的快照中返回数据。如果事务不使用写关注majority提交则snapshot读关注不保证读操作会使用大多数已提交数据的快照。对于分片集群上的事务数据的snapshot视图会在各分片之间同步。4.3、事务和写关注MongoDB数据库事务使用事务级的写关注来提交写入操作。事务内的写入操作必须在没有明确写关注规范的情况下执行并且必须使用默认的写关注。在提交时使用事务级的写关注来提交写入。设计人员可以在事务启动时设置事务级的写关注具体内容如下如果未设置事务级的写关注则事务级的写关注默认为提交的会话级的写关注。如果未设置事务级的写关注和会话级的写关注则事务级的写关注默认为客户端级的写关注具体定义如下。w: majority在MongoDB 5.0及更高版本中包含仲裁节点的部署与之前版本有所不同。w: 1。关于事务支持所有写关注的w值具体定义如下w: 1写关注w: 1会在提交应用于主节点后返回确认信息。使用w: 1提交时如果发生故障转移则可以回滚事务。使用w: 1写入关注提交时事务级majority读关注无法保证事务中的读操作会读取大多数已提交数据。使用w: 1写关注提交时事务级snapshot读关注无法保证事务中的读操作会使用大多数已提交数据的快照。w: “majority”在将提交应用于大多数投票节点后写关注w:majority会返回确认消息。使用w: majority写关注提交时事务级majority读关注可以保证操作已读取大多数已提交数据。对于分片集群上的事务大多数已提交数据的视图不会在各分片之间同步。使用w: majority写关注提交时事务级snapshot读关注可以保证操作已从大多数已提交数据的同步快照中读取。

相关新闻

【C++】重定向是什么

【C++】重定向是什么

1、什么是标准输入输出 C 默认: printf → 标准输出 stdout → 默认打印到屏幕scanf → 标准输入 stdin → 默认从键盘读取 重定向 改变数据流的目的地/来源 不让程序读写屏幕、键盘,改成读写文件。分为两种: ① 操作系统Shell重定向&#x…

2026/10/10 23:32:21 阅读更多 →
AI 现在写代码这么猛,咱程序员的核心竞争力还剩啥?

AI 现在写代码这么猛,咱程序员的核心竞争力还剩啥?

这段时间在公司负责技术架构演进和 AI Agent 工作流落地,组里几位年轻的资深工程师在复盘会上向我抛出了这个极其现实、甚至带有几分迷茫的问题: “老大,现在的 AI 写代码简直太疯狂了。从 GPT-5.6 家族 到 DeepSeek-V4,无论是写…

2026/10/11 0:20:23 阅读更多 →
Matomo埋点工具实战:从数据采集到分析应用

Matomo埋点工具实战:从数据采集到分析应用

1. Matomo埋点工具全景解析:从数据采集到分析应用作为一款开源的网站分析平台,Matomo在数据隐私保护日益重要的今天正获得越来越多企业的青睐。不同于传统GA工具,Matomo允许用户完全掌控自己的数据资产。在实际项目中,我们团队已经…

2026/10/11 0:19:12 阅读更多 →

最新新闻

Elasticsearch Reindex 实战指南:从机制解析到性能调优避坑

Elasticsearch Reindex 实战指南:从机制解析到性能调优避坑

1. 为什么需要 reindex:五个让我踩过坑的典型场景先给没接触过的朋友一个基本认知:reindex 不是某个数据库独享的功能,主流存储引擎基本都有类似的能力。我最早接触是在 Elasticsearch 上,后面在消息队列、关系型数据库分库分表扩…

2026/10/12 2:07:10 阅读更多 →
固定资产管理系统怎么选?从生命周期、折旧到RFID与盘点落地全拆解

固定资产管理系统怎么选?从生命周期、折旧到RFID与盘点落地全拆解

固定资产管理软件这个词,做企业服务和IT的人都绕不开,但真正被问住的时候往往在客户现场:对方拿出采购清单,说要买一套固定资产管理系统,理由是盘点太累了、审计总找麻烦、资产管理岗的人换了好几拨每次都从头理。你会…

2026/10/12 2:07:10 阅读更多 →
C语言实现广度优先搜索:马走日遍历算法详解

C语言实现广度优先搜索:马走日遍历算法详解

1. 项目背景与需求拆解1.1 什么是“之马遍历”?初次看到“广度优先搜索(之马遍历)C语言”这个标题,很多人可能会先愣一下。“之马”其实是象棋中“马走日”的另一种叫法,也叫“日字跳”或“骑士走法”。把一只马放在88…

2026/10/12 2:07:10 阅读更多 →
Nexent 工程规范全解:面向 AI Agent 的仓库地图、编码约束与开发验证流程

Nexent 工程规范全解:面向 AI Agent 的仓库地图、编码约束与开发验证流程

AI AgentAI 应用后端前端大模型RAG 【免费下载链接】nexent Nexent is a zero-code platform for auto-generating production-grade AI agents using Harness Engineering principles — unified tools, skills, memory, and orchestration with built-in constraints, feedba…

2026/10/12 2:07:10 阅读更多 →
Sherpa-onnx 跑 Zipformer ONNX 推理:3 步绕开 Required inputs missing

Sherpa-onnx 跑 Zipformer ONNX 推理:3 步绕开 Required inputs missing

Sherpa-onnx 跑 Zipformer ONNX 推理:3 步绕开 Required inputs missing 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Int…

2026/10/12 2:07:10 阅读更多 →
物理与动画系统架构深度解析:从帧循环到Transform协同的引擎设计要点

物理与动画系统架构深度解析:从帧循环到Transform协同的引擎设计要点

做引擎这几年,最常被问到的一个问题就是:物理和动画这两个模块放在一起讲,是不是有点强行组CP?其实不是,这俩在帧循环里的位置紧挨着,数据耦合又深,渲染那边等着同一份Transform结果。你拆开看会…

2026/10/12 2:06:09 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →