老生常谈:<在前面博客中也介绍过>

  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事物分析的更多相关文章

  1. mongodb新手入门,mongodb命令学习

    下面来总结一下mongodb新手入门的常用命令吧.要是您是mongodb新手,可以看下. 1,show dbs 查询mongodb里面的数据库列表 如果想查看当前连接在哪个数据库下面,可以直接输入db ...

  2. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  3. Nodejs学习笔记(十)--- 与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门

    目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门(mongo.exe客户端操作) 库操作 插入 查询 修改 删除 存储过程 nodejs操作MongoDB 插入 查询 ...

  4. MongoDB(2):入门

    MongoDB入门教程(包含安装.常用命令.相关概念.使用技巧.常见操作等) http://www.jb51.net/article/51514.htm 这篇文章主要介绍了MongoDB入门教程,包含 ...

  5. MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门

    MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshell.c ...

  6. Node.js和MongoDB - MongoJS入门

    第一次尝试翻译外国牛人的博文,希望大家喜欢. 本文源码详见:https://github.com/njaulj/mongojs 一点都不夸大的说,近年来node.js和mongodb的确是大放异彩,在 ...

  7. 大数据应用之:MongoDB从入门到精通你不得不知的21个为什么?

    一.引言: 互联网的发展和电子商务平台的崛起,催生了大数据时代的来临,作为大数据典型开发框架的MongoDB成为了No-sql数据库的典型代表.MongoDB从入门到精通你不得不知的21个为什么专为大 ...

  8. MongoDb 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...

  9. 在.Net Core中使用MongoDB的入门教程(二)

    在上一篇文章中,讲到了MongoDB在导入驱动.MongoDB的连接,数据的插入等. 在.Net Core中使用MongoDB的入门教程(一) 本篇文章将接着上篇文章进行介绍MongoDB在.Net ...

随机推荐

  1. Introduction to CELP Coding

    Speex is based on CELP, which stands for Code Excited Linear Prediction. This section attempts to in ...

  2. 机器学习技法笔记:16 Finale

    Roadmap Feature Exploitation Techniques Error Optimization Techniques Overfitting Elimination Techni ...

  3. Liferay7 BPM门户开发之19: 理解Service Builder体系

    Service Builder是Liferay为业务开发而设计的模型驱动(model-driven)平台工具,提供一系列的实体类.数据持久化.服务相关的代码自动生成服务.支持Hibernate and ...

  4. 如何用java POI将word中的内容导入到mysql数据库中

    由于作业需要,要求我们将word文档中的数据直接导入到mysql中,在网上找了很常时间,终于将其解决. 由于比较初级,所以处理的word文档是那种比较规范的那种,条例比较清晰,设计的思路也比较简单,就 ...

  5. Java获取URL中的顶级域名domain的工具类

    方式一: import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import jav ...

  6. MySQL笔记(8)---备份与恢复

    1.前言 本章记录数据库的备份与恢复操作.MySQL提供了很多工具完成备份工作:mysqldump.ibbackup.replication,也可以使用一些第三方的工具完成,如xtrabacup.LV ...

  7. Hive ROW_NUMBER,RANK(),DENSE_RANK()

    准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100   创建表 CREATE t ...

  8. volatile 关键字了解与使用

    前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能. 首先来看看为什么会出现这个关键字. 内存可见性 由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个 ...

  9. Android中为什么需要服务?

    在解释这个问题之前, 先来看一个Android系统中进程的优先级(从高到低) 前台进程(foreground process ):  一个应用程序启动, 并且可以直接相应用户的点击,触摸事件.那么这样 ...

  10. WC2017游记 & 能力残废康复计划

    懒癌晚期的蒟蒻一年多没有更Blog了… 这次冬眠营去绍一省好好地游玩了一番,体验了一段时间的豪华自助餐,成功吃胖… 第一课堂的东西基本还是没吸收…听着觉得有点道理,结果过几分钟就忘了…可能最大的收获就 ...