事务

什么是事务

在说 Mongodb 之前, 先了解一下什么是事务.

事务是逻辑上的一组操作, 组成这组操作的各个单元, 要不全都成功, 要不全都失败, 这个特性就是事务.

那这有什么用呢?

假想一个场景, 现在有两个表, 一个 用户 表保存了用户的资料, 一个 权限 表保存了用户的权限, 那么, 如果你要删除一个用户, 你即需要删除 用户 表里的基本资料, 也要删除 权限 表的权限, 对吧?

那么问题来了, 现在开始删除用户, Ok, 你已经删除了 用户 表里的基本资料, 然后...断电了~~~So...你的数据现在就有可能异常, 因为你只删除了 用户 表里的基本资, 而没有删除 权限 表的权限资料!

所以, 事务的就应运而生...

你可以将删除 用户 表里的基本资料和删除 权限 表的权限资料两个操作封装成事务, 然后再去执行, 这样要么全部执行成功, 要么全部执行失败, 这样就避免了某个操作成功某个操作失败, 而且执行过程中是原子的, 不会被其他的操作影响.

Mongodb 的事务

现在我们已经知道了事务的用处及好处, 但可惜的是...

Mongodb 目前不能创建一个事务处理多个集合!!! 什么意思呢?

就是说, Mongodb 只保证你向一个集合里写数据是"事务"的... 假设你有个集合, 你向里面插入一条 Document, 那么 Mongodb 能保证你把整个 Document 都完整的插入;

官网上大概是这么说的: 多文档的事务不是必须的, Mongodb 可以保存更种复杂的数据, 所以你可以设计出高内聚的集合, 避免出现同时 update 多个集合的情景.... (感觉 Mongodb 就是在给用户洗脑, 还美其名曰 Mongodb 支持单集合事务, 这算哪门子事务)

于是问题来了: 有些情况下, 你必须同时进行多文档处理...所以, 怎么办呢?

所以, 如果你开发的系统是事务要求严格的系统(如果银行系统), 那建议还是不要用 Mongodb 吧... 如果还是想用, 可以参考官方的解决方案: 使用异步提交的方式, 有人把它翻译成中文的了: 中文使用异步提交的方式

Last updated