Mongodb的入门(8)mongodb事物分析
老生常谈:<在前面博客中也介绍过>
mongodb官网:https://docs.mongodb.com/manual/introduction/
mongodb:官网上是这样定义的MongoDB is an open-source document database that provides high performance, high availability, and automatic scaling.翻译成中文:是一个开源文档数据库,提供高性能,高可用性和自动扩展。
mongodb4:
1 > MongoDB CTO Eliot Horowitz 刚刚于2月16日凌晨在MongoDB西雅图大会上宣布,MongoDB将在4.0版本中正式推出多文档ACID事务支持 。
2 > “MongoDB 4.0 将支持多文档事务,届时MongoDB将成为唯一能够同时支持速度,灵活性,JSON文档模型优势和ACID数据完整性保证的数据库。通过快照隔离,(MongoDB)的事务能够提供一个全局一致的数据视图,
并可以实现all-or-nothing的事务提交及回滚机制,保证数据的完整性。”
3 > 这个功能的支持,完全不亚于2014年MongoDB引入WiredTiger存储引擎的影响力。因为这个功能的引入,原计划是3.8版本的MongoDB将直接进入4.0时代。
4 > ACID 多文档事务,可以理解为关系型数据库的多行事务。在关系型的事务支持中,大家几乎无一例外支持同一事务内操作的原子性,即要么全部提交,要么全部回滚。这个同一事务内可以有多个操作,针对于多个表,或者是同一个表内的多行数据。
注意:我在之前就介绍过mongodb以前也是有事务的,不过事物是在单文档操作上存在事务。现在介绍的是mongodb的多文档的原子事务
介绍:
mongodb 的事务是依靠 mongodb 连接的客户端 session 实现,事务执行的流程大致是 建立 session,通过 session startTransaction 启动事务,如果一系列事务都完成,那么 commitTransaction 完成事务操作,并结束当前事务 session;如果一系列事务中有任意事件失败, 那么 abortTransaction 中止事务,内部将已完成的任务回退到修改之前,并结束当前事务 session。

事务和副本集(Replica Sets)
副本集是 MongoDB 的一种主副节点架构,它使数据得到最大的可用性,避免单点故障引起的整个服务不能访问的情况的发生。目前 MongoDB 的多表事务操作仅支持在副本集上运行,想要在本地环境安装运行副本集可以借助一个工具包——run-rs,
以下的文章中有详细的使用说明:https://thecodebarbarian.com/
事务和会话(Sessions)
事务和会话(Sessions)关联,一个会话同一时刻只能开启一个事务操作,当一个会话断开,这个会话中的事务也会结束。
事务中的函数
- Session.startTransaction()
在当前会话中开始一次事务,事务开启后就可以开始进行数据操作。在事务中执行的数据操作是对外隔离的,也就是说事务中的操作是原子性的。
- Session.commitTransaction()
提交事务,将事务中对数据的修改进行保存,然后结束当前事务,一次事务在提交之前的数据操作对外都是不可见的。
- Session.abortTransaction()
中止当前的事务,并将事务中执行过的数据修改回滚。
重试
当事务运行中报错,catch 到的错误对象中会包含一个属性名为 errorLabels 的数组,当这个数组中包含以下2个元素的时候,代表我们可以重新发起相应的事务操作。
- TransientTransactionError:出现在事务开启以及随后的数据操作阶段
- UnknownTransactionCommitResult:出现在提交事务阶段
mongo模拟事务实现:
mongodb的多文档事务是基于副本集或者分片实现的,那我现在来简单再搭建一个mongo4 的副本集集群(大家还记得副本集和主从复制的区别吗?不知道的可以参考 Mongodb的入门(6)副本集 )
下面我再搭建一下副本集,后期不会再搭建,请大家注意搭建步骤:
第一步:创建一个mongodb副本集的文件夹:E:\mongdb4
在里面创建三个文件夹:分别是1688,1689,1690 这样我会把响应的端口号也设置成1688,1689,1690。

第二步: 在每个文件夹下放入响应的mongodb服务。如果已经安装直接拷贝过来即可:

注意。这步要做一下处理,因为你不是最新安装的,里面可能会有数据或日志。

第三步:假设你已经处理好三个文件夹的文件,日志等数据都已经删除。环境已经干净。
下面我来做副本集:
1》 创建是哪个文件夹来保存数据

2> 分别进入各个bin下执行如下命令:
mongod.exe --replSet shard1 --dbpath=E:\mongdb4\data\1688 --port=1688
mongod.exe --replSet shard1 --dbpath=E:\mongdb4\data\1689 --port=1689
mongod.exe --replSet shard1 --dbpath=E:\mongdb4\data\1690 --port=1690
执行之后会有:

第四步:配置副本集
任意进入一个bin下,连接到mongo上测试 mongo.exe --port=1688

rsconf = {_id: "shard1", members: [ { _id: 0, host: "127.0.0.1:1688" } ] }
rs.initiate( rsconf )
rs.add("127.0.0.1:1689")
rs.add("127.0.0.1:1690")
到这副本集就配置完成了。再介绍几个命令用于维护副本集
rs.isMaster(); 查看是不是主节点
rs.status(); 查看副本集的状态。如下:


springboot操作副本集:
环境搭建,不介绍了,假设环境已经搭建好了。如:

第一步:配置mongo连接信息:

第二步测试:
/**
* @author huhy
* @ClassName:SpringbootMongodb4ApplicationTests
* @date 2018/11/23 11:26
* @Description: 测试事务
*/
@Test
public void testTro(){
int a = ;
//获取ClientSession
ClientSession clientSession = mongoClient.startSession();
Money yang = mongoTemplate.findById("", Money.class);
Money hui = mongoTemplate.findById("", Money.class);
int pay = yang.getPay()- a;
hui.setPay(pay);
yang.setPay(pay);
try {
//开启事务
clientSession.startTransaction();
//为mongoTemplate注入的事务特性
MongoTemplate mongoTemplate = this.mongoTemplate.withSession(clientSession);
mongoTemplate.save(hui);
mongoTemplate.save(yang);
if (pay < ){
System.out.println("abortTransaction");
//撤销事务
clientSession.abortTransaction();
}
} catch (Exception e) {
//提交事务
clientSession.commitTransaction();
e.printStackTrace();
}
} note:注意:springboot 操作mongo时候,要注意:有两种事务的特性:
1》MongoTemplate mongoTemplate = this.mongoTemplate.withSession(clientSession);
2》 在文档级别注入:
我在这提醒一下大家。基于文档才是原生的,mongTemplate是为了方便我们使用才用的。
3》有一部分基于mongo的注解在实体上,我就不贴出来了,有兴趣的可以自己搞一下。
Mongodb的入门(8)mongodb事物分析的更多相关文章
- mongodb新手入门,mongodb命令学习
下面来总结一下mongodb新手入门的常用命令吧.要是您是mongodb新手,可以看下. 1,show dbs 查询mongodb里面的数据库列表 如果想查看当前连接在哪个数据库下面,可以直接输入db ...
- 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)
今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...
- Nodejs学习笔记(十)--- 与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门(mongo.exe客户端操作) 库操作 插入 查询 修改 删除 存储过程 nodejs操作MongoDB 插入 查询 ...
- MongoDB(2):入门
MongoDB入门教程(包含安装.常用命令.相关概念.使用技巧.常见操作等) http://www.jb51.net/article/51514.htm 这篇文章主要介绍了MongoDB入门教程,包含 ...
- MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshell.c ...
- Node.js和MongoDB - MongoJS入门
第一次尝试翻译外国牛人的博文,希望大家喜欢. 本文源码详见:https://github.com/njaulj/mongojs 一点都不夸大的说,近年来node.js和mongodb的确是大放异彩,在 ...
- 大数据应用之:MongoDB从入门到精通你不得不知的21个为什么?
一.引言: 互联网的发展和电子商务平台的崛起,催生了大数据时代的来临,作为大数据典型开发框架的MongoDB成为了No-sql数据库的典型代表.MongoDB从入门到精通你不得不知的21个为什么专为大 ...
- MongoDb 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...
- 在.Net Core中使用MongoDB的入门教程(二)
在上一篇文章中,讲到了MongoDB在导入驱动.MongoDB的连接,数据的插入等. 在.Net Core中使用MongoDB的入门教程(一) 本篇文章将接着上篇文章进行介绍MongoDB在.Net ...
随机推荐
- Linux - 获取命令帮助信息
Manual Page Chapter List 1:所有用户可以操作的指令或可执行文件 2:系统核心调用的函数与工具 3:子调用,常用的函数与函数库 4:设备,硬件文件说明,通常是/dev/的文件 ...
- Origin的使用问题集锦
在空间上看见同学转的一篇关于学术研究的文章,由于不常常上空间,更别说在上面看一些好的文章,所以特意将那篇文章整理到自己的博客中,方便以后做科研的时候能够用到,原文出处:http://user.qzon ...
- 25-socket
socket通信流程 #server端 #family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括#Internet地址,AF_UNIX家族用于同一台机器上的进程间通信 ...
- Jupyter中python3之numpy练习
---恢复内容开始--- Numpy_pratice In [2]: n = 10 L = [i for i in range(n)] In [3]: L * 2 Out[3]: [0, 1, 2, ...
- 13-02 Java 数组高级算法,Arrays类
冒泡排序 冒泡排序原理 冒泡排序代码: package cn.itcast_01; /* * 数组排序之冒泡排序: * 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 */ pub ...
- Android 引用文件(.db)的三种方式
1.assets —— 资产目录(该目录中的文件会被直接打包到 apk 文件中).获取该目录下的文件的方式是: InputStream is = getContext().getAssets().op ...
- Android_Fragment和Activity之间的通信
Fragment 的生命周期是随着activity变化而变化的. 如果activity要给在运行的时候给fragment传人数据则需要fragment实现一个自定义的接口,并且实现接口里面的方法,在a ...
- 7.28-说说对javaweb的感想吧
接触了几个月的java,和javaweb. 感想1:发现生活顿时充实了很多,时间照样在过,日落日出,但是手里面有学的,有可以让自己开心地码出理想的效果,这是很不错的结局. 发现自己再也不回去和伙伴们撸 ...
- 使用InstallUtil发布windows服务
发布Windows Service的方法 1. 在默认窗口Service1中右键Add Install,自动生成两个类. 2. 修改serviceInstaller1的属性: a)ServiceNa ...
- 通过jenkins API去build一个job
背景 查看jenkins的api 直接访问 JENKINS_URL/job/JOB_NAME/api/ 就可以查看jenkins的api build一个job的话,是POST请求 JENKINS_UR ...
