运行两步提交

概述

这部分提供了多记录更新或者多记录事务。使用两步提交来完毕多记录写入的模板。

另外。能够扩展此方法来提供rollback-like功能。

背景

MongoDB对于单条记录的操作是原子性的。可是涉及多条记录的操作却不是原子性的。

因为记录可能是相当复杂。而且有内嵌记录,单记录原子性操作提供了实际中经常使用的必要支持。

除了单记录的原子性操作,还有很多情况须要多记录操作事务。当运行一个包括一些列操作的事务时,就有下面要求:

原子性:假设一个操作失败,事务中之前的操作须要回滚到之前的状态

一致性:假设一个重大失误,比方网络故障,硬件故障,中断了事务,数据库必须可以恢复到之前的状态

对于须要多记录操作的事务,能够在应用中实现两步提交的方法,来提供多记录更新支持。

使用这样的方法保证了一致性。而且万一出现错误,事务的运行状态是可恢复的。然而在这个过程中。记录处于未定的数据和状态。

注意:由于MongoDB仅仅有单记录操作是原子性的,两步提交仅仅能提供语义上的“类事务”功能。

对于应用来说,使其可以回到在两步提交中的某个状态的中间数据或者回滚数据。

模板

考虑下面情景:

要将资金从账户A转移到账户B,在关系型数据库中,能够在一个事务中从A中减去资金,同一时候在B中加上。在MongoDB中,能够模拟两步提交来获得同样结果。

这个样例使用两个集合

1.accounts,用于存储账户信息

2.transactions,用于存储资金转移事务的信息

初始化账户信息

db.accounts.insert(

[

{ _id: "A", balance: 1000, pendingTransactions: [] },

{ _id: "B", balance: 1000, pendingTransactions: [] }

]

);

初始化转账记录

对于每次资金转移操作,将转账信息加入到transactions集合中,插入的记录包括下面信息:

source和destination字段。引用自ccounts集合中的_id字段

value字段,声明转移数值

state字段,表明当前转移状态,值能够是initial,pending, applied, done, canceling, 或者 canceled.

lastModified字段,反应最后改动日期



从A转账100到B,初始化transactions记录:

db.transactions.insert({ _id: 1, source: "A", destination: "B", value: 100, state: "initial", lastModified: new Date() });

使用两步提交进行转账

1.从transactions集合中,找到state为initial的记录。

此时transactions集合中仅仅有一条记录,即刚插入的那条。

在包括其它记录的集合中,除非你声明了其它查询条件。否则这个查询将返回不论什么state为initial的记录。

var t = db.transactions.findOne( { state: "initial" } );

在MongoDB的shell中输入t,查看t的内容,类似于:

{ "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "initial", "lastModified":?

?

}

2.更新事务状态为pending

设置state为pending,lastModified为当前时间

db.transactions.update(

{ _id: t._id, state: "initial" },

{

MongoDB 操作手冊CRUD 事务 两步提交的更多相关文章

  1. MongoDB 操作手冊CRUD插入

    插入操作 插入记录 1.插入一条记录 db.testData.insert({num:1,name:'a'}); 结果 WriteResult({ "nInserted" : 1 ...

  2. MongoDB 操作手冊CRUD查询指针

    枚举遍历指针 概述 前面已经讲过,db.collection.find()假设没有指定给一个var声明的变量.将自己主动枚举前20条记录. 手动枚举指针 在mongo控制台中.将查询赋给一个var声明 ...

  3. MongoDB 操作手冊CRUD 删除 remove

    删除记录 概述 在MongoDB中,db.collection.remove()方法用于删除集合中的记录.能够删除全部记录,删除全部符合条件的记录.或者是仅删除一条记录. 删除全部记录 删除一个集合中 ...

  4. MongoDB 操作手冊CRUD 更新 update

    改动记录 概述 MongoDB提供了update()方法用于更新记录. 这种方法接受下面參数:     一个更新条件的JSON对象用于匹配记录,一个更新操作JSON对象用于声明更新操作,和一个选项JS ...

  5. 分布式事务 & 两阶段提交 & 三阶段提交

    可以参考这篇文章: http://blog.csdn.net/whycold/article/details/47702133 两阶段提交保证了分布式事务的原子性,这些子事务要么都做,要么都不做. 而 ...

  6. 分布式事务 spring 两阶段提交 tcc

    请问分布式事务一致性与raft或paxos协议解决的一致性问题是同一回事吗? - 知乎 https://www.zhihu.com/question/275845393 分布式事务11_TCC 两阶段 ...

  7. 聊一聊 MySQL 中的数据编辑过程中涉及的两阶段提交

    MySQL 数据库中的两阶段提交,不知道您知道不?这篇文章就简单的聊一聊 MySQL 数据库中的两阶段提交,两阶段提交发生在数据变更期间(更新.删除.新增等),两阶段提交过程中涉及到了 MySQL 数 ...

  8. 转载:mongodb的两阶段提交实战

    项目中用到了mongodb(3.x版本),业务上需要操作mongodb的多个collections,希望要么同时操作成功,要么回滚操作保持数据的一致性,这个实际上要求在mongodb上实现事务功能,在 ...

  9. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

随机推荐

  1. <深入理解计算机系统> CSAPP Tiny web 服务器

    本文是我学习<深入理解计算机系统>中网络编程部分的学习笔记. 1. Web基础       web客户端和服务器之间的交互使用的是一个基于文本的应用级协议HTTP(超文本传输协议).一个w ...

  2. 【CF1015B】Obtaining the String(模拟)

    题意:给定两个字符串,每次可以交换相邻两个字符,给出任意一组交换次数小于1e4的方案使得a串成为b串,输出交换的次数与位置,无解输出-1 n<=50 思路:每次找到第一个不相同的字符,从后面找到 ...

  3. 一款手机端的日历插件ICalendar.js

    我的网盘:http://pan.baidu.com/s/1jIib2Ay

  4. 标准C程序设计七---65

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  5. php 几种排序模式

    冒泡排序 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工>作 ...

  6. Python Challenge 第五关

    进入第五关,一张图和一行提示: pronounce it.右键源代码,只有一行注释: <!-- peak hell sounds familiar ? --> peak hell 听起来熟 ...

  7. facebook面试题【转】

    1. 给两个类A和Bclass A {public void foo (A a) { ...}}class B extends A {public void foo (B b) { ...}}问这么写 ...

  8. eclipse 五种断点

    1. Line BreakpointLine Breakpoin是最简单的Eclipse断点,只要双击某行代码对应的左侧栏,就对该行设置上断点. 2. WatchpointLine Breakpoin ...

  9. DNA的分子结构

    DNA是由两条链组成的, 这两条链按反相平行的方式盘旋成双螺旋结构 DNA分子中的脱氧核糖和磷酸交替连接, 排列在外侧, 构成基本骨架; 碱基排列在内侧. 两条链上的碱基通过氢键连接成碱基对, 并且其 ...

  10. Java EE官方文档汇总

    Java EE是一个开发规范标准,各个容器厂商根据标准去实现,比如Tomcat等,其中Oracle通过标准用GlassFish去实现. 5:https://docs.oracle.com/javaee ...