第8章 事务:一致性边界的用法与滥用


第 8 章 · 事务:一致性边界的用法与滥用

章节摘要:MongoDB 4.0 起支持多文档 ACID 事务,基于复制集与快照隔离实现,代价是锁开销、超时限制与重试复杂度。本章从事务超时事故与"把 MongoDB 当关系库用"的滥用事故讲事务原理与正确使用边界。读完本章,你能判断什么场景该用事务、什么场景该靠建模绕开。

学习目标

  1. 能说明多文档事务的实现基础(快照隔离、oplog、多数派提交);
  2. 能编写带 writeConcern、超时与重试的事务代码;
  3. 能列出事务的硬限制(60 秒默认上限、16MB oplog 条目等);
  4. 能识别"应靠建模解决却上了事务"的反模式。

核心概念速览

金句:事务是收费的一致性——每一次"要么全成要么全不成",都在用吞吐量和超时风险付费。

子章节导航

  • 8.1 ACID 与实现:超时回滚事故,讲快照隔离、提交路径与限制。
  • 8.2 场景与滥用:账户系统事故,讲该用事务的场景与该绕开的场景。

子章节之间的逻辑关系

8.1 讲事务的机理与账单,8.2 讲付费决策——先看价目表,再决定买不买。

机理与限制(8.1) ──► 场景决策(8.2) │ │ 快照隔离·60秒 原子单文档 vs 建模 vs 事务 ​

子章节导航补记

两节的导航文字需要加厚一层。8.1 的复盘认真还原了积分系统六小时的定位过程:profiler 里每条语句都快、慢的是事务持有时长,这个"反直觉现场"值得每个第一次排事务问题的人预演一遍;红线参数表覆盖 60 秒存活上限、16MB oplog 条目、快照对 oplog 窗口的依赖,是排错时的第一张速查卡。8.2 的数字对比是本章最有说服力的证据——单文档原子写与大事务七倍的吞吐差、百分之十八的冲突率、被压缩的 oplog 窗口,三笔账算完,"顺手包个事务"的冲动会消失大半;拆步骤的下单链路代码是可直接套用的模板。

本章知识点核对清单

离开本章前逐条自查:能否用快照隔离与单条 oplog 提交解释多文档事务的原子性来源;能否说出事务时间预算里为什么不能有外部 IO;能否写出带错误类别判断与指数退避的重试封装;能否对着一条 TransientTransactionError 堆栈说出排查动作;能否为下单、转账、双写迁移三个场景分别选定工具箱层级并给出理由。答不上的条目,回对应小节把六小时复盘与七倍吞吐对比再看一遍。

一个判断口径

把整章压成一句可以在代码评审时直接引用的口径:改动跨越两个以上文档、且业务上不允许出现中间态,才考虑多文档事务;其余一切一致性诉求,先问单文档操作符能否表达,再问建模能否合并。评审时对方拿不出"中间态会造成什么具体损失"的答案,事务就该被否掉——这句话救过很多系统的吞吐量。

版本前提与常见误解

事务能力有明确的地基要求:4.0 起在复制集上可用,4.2 起才扩展到分片集群;旧版本单机 mongod 上开事务会直接报错。三个高频误解顺便钉死:误解一,"事务能代替唯一索引"——不能,唯一性约束仍要靠索引,事务里的重复插入照样要靠 DuplicateKey 报错来感知;误解二,"事务里的读不加锁所以随便读"——快照读确实不阻塞写,但长事务会钉住 oplog 窗口,代价转嫁给了复制链路;误解三,"abort 会自动重试"——不会,驱动只对特定错误类别重试,业务语义的重试永远要自己写对退避。把这三条误解澄清掉,本章两起事故的形态都能在代码评审阶段被拦下。

前置知识与后续延伸

前置:第 6 章复制集。延伸:事务重试逻辑与第 10 章的锁监控直接相关。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U