事务、会话与重试
MongoDB 支持多文档 ACID 事务,但事务不是默认建模工具。本主题的第一原则是:优先用文档模型(嵌入/单文档原子性)消除事务需求,只有确有必要时才引入多文档事务,并正确处理会话、重试与性能影响。
本章条目
| 编号 | 条目 | 类型 | 难度 | 一句话摘要 |
|---|---|---|---|---|
| TXN-01 | 多文档事务原理与边界 | 指南 | 高级 | session/concern 组合、错误重试、跨分片成本、反模式 |
核心原则
先问「能不能不用事务」
单文档写入天然原子。如果把「需要一起变更的数据」通过合理嵌入放进同一文档,就无需事务。把事务当默认解法是反模式——它带来锁、缓存压力、oplog 开销和重试复杂度。
- 事务有成本:加锁、占用缓存、增大 oplog、有生命周期超时。
- 必须处理两类错误:
TransientTransactionError(可整体重试)与UnknownTransactionCommitResult(可重试提交)。 - 跨分片事务更贵:涉及两阶段提交与更强的协调开销。
相关主题
- 用建模消除事务:见 按访问模式建模
- 事务依赖的一致性语义:见 read/write concern
- 单文档 vs 多文档事务决策表:见 决策表
