事务基础

事务用于保证多次写操作要么都成功,要么都失败。

例如转账:

  1. A 扣钱。
  2. B 加钱。

这两步必须作为一个整体。

一、MongoDB 是否支持事务

MongoDB 支持多文档事务,但事务不是 MongoDB 的第一设计目标。

很多 MongoDB 业务会通过合理文档建模,把需要同时更新的数据放在一个文档里,减少事务需求。

多文档事务通常用于:

  • 订单和库存同时更新。
  • 账户余额变更。
  • 多集合写入必须保持一致。

二、事务适用环境

多文档事务通常用于副本集或分片集群环境。

如果你只是用最简单的单节点本地 Docker 学习环境,不建议一开始就纠结事务配置。

先理解事务适合解决什么问题,再在真实项目环境里配置副本集和事务。

三、单文档写入是原子的

MongoDB 对单个文档的写入是原子的。

例如:

db.posts.updateOne(
  { _id: ObjectId("665f0e0b6f8c2b5f8e123456") },
  {
    $inc: {
      "stats.views": 1
    }
  }
)

这个更新不会只改一半。

所以如果一个业务的数据天然可以放在一个文档里,就不一定需要事务。

四、不要滥用事务

事务会带来额外成本。

如果一个操作可以通过文档建模解决,就不要为了“像 MySQL 一样”强行使用事务。

例如文章浏览量:

db.posts.updateOne(
  { _id: postId },
  { $inc: { "stats.views": 1 } }
)

这种单文档原子更新不需要事务。

五、后端项目里的判断方式

可以这样判断:

问题建议
只改一个文档通常不需要事务
多个字段在同一个文档里通常不需要事务
必须同时改多个集合考虑事务
数据最终一致即可可以考虑异步补偿或消息队列
金额、库存等强一致场景谨慎使用事务并做好测试

初学阶段先把 CRUD、索引、建模学扎实,再深入事务。