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

  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连接信息:

     

  第二步测试:

        

   

  1. /**
  2. * @author huhy
  3. * @ClassName:SpringbootMongodb4ApplicationTests
  4. * @date 2018/11/23 11:26
  5. * @Description: 测试事务
  6. */
  7. @Test
  8. public void testTro(){
  9. int a = ;
  10. //获取ClientSession
  11. ClientSession clientSession = mongoClient.startSession();
  12. Money yang = mongoTemplate.findById("", Money.class);
  13. Money hui = mongoTemplate.findById("", Money.class);
  14. int pay = yang.getPay()- a;
  15. hui.setPay(pay);
  16. yang.setPay(pay);
  17. try {
  18. //开启事务
  19. clientSession.startTransaction();
  20. //为mongoTemplate注入的事务特性
  21. MongoTemplate mongoTemplate = this.mongoTemplate.withSession(clientSession);
  22. mongoTemplate.save(hui);
  23. mongoTemplate.save(yang);
  24. if (pay < ){
  25. System.out.println("abortTransaction");
  26. //撤销事务
  27. clientSession.abortTransaction();
  28. }
  29. } catch (Exception e) {
  30. //提交事务
  31. clientSession.commitTransaction();
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. note:注意:springboot 操作mongo时候,要注意:有两种事务的特性:
        
  1. 1MongoTemplate 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. LeetCode:146_LRU cache | LRU缓存设计 | Hard

    题目:LRU cache Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...

  2. Python基础教程(第3版) 笔记(一)

    1.1 数和表达式: 除法运算的结果为小数,即浮点数 >>>1/2 0.5 除法运算为整数,使用双斜杠 >>>1//2 0 >>>5.0//2.4 ...

  3. Java RMI 概观

    RMI是Java的一组拥护开发分布式应用程序的API. RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol) ...

  4. walle多渠道打包+Tinker(bugly)热更新集成+360加固(乐固)

    这三个东东是干啥的相信大家都有所耳闻了,如果你没有听说过,请出门左拐,百度一下你就知道.这里不对这三个东东具体的集成方式做详细的介绍,因为官方文档已经写的很详细了,主要是对同时使用这三个东东时所需要注 ...

  5. Json数据中同字段不同数据类型的解析

    当解析Json数据时,如果碰到同字段不同数据类型的情况,如何处理呢?比如: [ { "code": 1, "data": 33 }, { "code& ...

  6. Django集成OpenLDAP认证

    本文详细介绍了django-auth-ldap的使用方法,参数含义,并提供了示例代码 版本说明 Django==2.2 django-auth-ldap==1.7.0 集成过程 Django集成LDA ...

  7. android开发(2):多页面的实现 | Fragment的创建与使用

    APP中出现多个页面再常见不过了.使用activity与fragment都能实现多页面,这里使用fragment来实现.延续“知音”这个APP的开发,之前已经创建了底部导航条与mainactivity ...

  8. 获取访问者的IP地址

    function getIp() { $realip = NULL; if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ipArray = explode( ...

  9. Python 3 进阶 —— print 打印和输出

    在 Python 中,print 可以打印所有变量数据,包括自定义类型. 在 2.x 版本中,print 是个语句,但在 3.x 中却是个内置函数,并且拥有更丰富的功能. 参数选项 可以用 help( ...

  10. 记一次安装Nginx+php-fpm安装后无法解析.php文件,状态码200,但显示空白页

    安装环境: Nginx:Nginx1.12.2 PHP:PHP 7.2 系统:CentOS 7.4 安装方式: Nginx与PHP都是yum安装的,具体步骤: 1.安装epel源再安装Nginx: r ...