08、Mongodb 事务

Par @Martin dans le
Tags :

什么是事务

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

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

那这有什么用呢?

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

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

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

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

Mongodb 的事务

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

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

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

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

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

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