首页 > 代码库 > Mongdb事务和原子操作

Mongdb事务和原子操作

首先,原则上说Mongdb没有事务的概念。

事务有ACID的概念,比如原子性,一个事务要么全部成功,要么全部失败。

如,考虑一个转账的业务,从A转账100到B,将分为两步:

A = A - 100;

B = B + 100;

在Mongdb中,如果A = A - 100;执行完,将会直接入库生效,没有回滚段的概念,所以如果此时B = B + 100;出现了问题,是不能回滚上一步A的操作的。所以说,Mongdb是没有原子性的。

然后说一致性,简单的来说读一致性,Mongdb都无法保证。Mongdb为了保证读取到的数据是不会回滚的(相对于Oracle来说,就是未提交的数据,保证没有脏读),已经花了很大的心思,在最新的 3.4版本才实现,而且是建立在Mongdb的查询都是单个集合的基础之上的。更别说要去保证读取的数据要是查询开始那个时间点的数据了。

这并不是说Mongdb比较笨拙,不如Oracle,是因为Mongdb的架构给我们带来了可以水平扩展的优势,就损失了事务方面的功能。

 

其实在Mongdb中,对于单个语句,是可以实现原子性的。

这里的单个语句,对Mongdb来说,就是针对单个collection的update和delete操作。比如,如果批量update 100条数据,在第99条出现了问题,是可以回滚的。但是这个并不是事务,这个是一个update语句的基本功能,如果执行一个update语句,你都不能确定能不能都执行成功,那么这个数据库还怎么用呢。

Mongdb事务和原子操作