Mongdb事务和原子操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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事务和原子操作的主要内容,如果未能解决你的问题,请参考以下文章