事务超时时间需显式调低默认60秒的transactionTimeoutMillis,生产环境建议设为5–15秒;跨分片事务须确保所有操作带分片键谓词且集合路由一致;writeConcern禁用w:"majority"+j:true,推荐w:"majority"或w:2。

事务超时时间必须显式调低
默认60秒的 transactionTimeoutMillis 在高并发写场景下容易引发长事务堆积,拖慢整个副本集的写入吞吐。生产环境应根据业务最长操作耗时设定,通常设为5–15秒更安全。
Spring Boot 中需在 application.yml 显式配置:
spring:
data:
mongodb:
uri: mongodb://localhost:27017/testdb?transactionTimeoutMillis=8000
- 低于5秒可能误杀合法事务(如含远程HTTP调用或批量更新)
- 高于30秒会显著增加锁持有时间,提高冲突概率
- 该参数只对新开启的事务生效,已运行事务不受影响
避免跨分片事务中的非原子性操作
MongoDB 5.0 分片集群事务支持跨分片,但前提是所有参与集合必须使用相同分片键且路由到同一分片组。一旦出现 TransactionNotEligibleForRetry 或 StaleConfig 错误,说明事务被拆分为多个非原子子事务——这在生产中等同于数据不一致。
验证方式:执行前检查 sh.status() 确保目标集合已启用分片且 chunk 均匀分布;事务内所有 find/update 操作必须带分片键谓词(如 {shardKey: "user_id"})。
- 未带分片键的查询会触发广播,导致事务拒绝执行
- 混合使用分片集合与非分片集合(如 config 数据库)直接报错
- 事务内禁止执行
createCollection、dropDatabase等DDL操作
写关注(writeConcern)不能设为 majority + j:true
在多节点副本集上,writeConcern: {w: "majority", j: true} 虽保证持久性,但会使事务提交延迟翻倍以上——尤其当仲裁节点(arbiter)参与投票时,journal刷盘等待会卡住整个事务流程。
生产推荐组合:
- 多数写入场景:
w: "majority"(不加j:true),依赖WiredTiger缓存刷盘机制 - 金融类强一致性场景:改用
w: 2(明确指定主+一个从),避免仲裁节点参与投票 - 绝对禁止在事务中动态修改 writeConcern,否则驱动抛出
InvalidOptions
事务内聚合管道必须限制 stage 数量
MongoDB 5.0 对事务内聚合操作有隐式限制:超过4个 stage(如连续 $match、$lookup、$project、$sort)可能触发内存溢出或超时中断,错误信息为 ExceededMemoryLimit 或 InterruptedAtShutdown。
实操建议:
- 把复杂聚合拆到事务外预计算,仅在事务内做轻量级
$set或$inc - 必须用聚合时,优先用
$lookup替代多次find,但限制pipeline总长度 ≤3 stage - 禁用
$out和$merge,它们不支持事务上下文

















