运行两步提交

概述

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

另外。能够扩展此方法来提供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. net5:自定义验证控件服务器端验证与客户端验证的使用

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  2. Atcoder CODE FESTIVAL 2017 qual B E - Popping Balls 组合计数

    题目链接 题意 \(A+B\)个球排成一行,左边\(A\)个为红球,右边\(B\)个为蓝球. 最开始可以选择两个数\(s,t\),每次操作可以取左起第\(1\)或\(s\)或\(t\)个球.问有多少种 ...

  3. python 中各种数据类型的排序问题

    list #按照list的第二键值排序 disP2P = [[1,2,3],[2,3,4],[4,5,6]] disP2P = sorted(disP2P,key = lambda x:x[2]) s ...

  4. 机器学习实战读书笔记(二)k-近邻算法

    knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训 ...

  5. [原创][Verilog]个人.v文件书写规范

    1> 文件名命名,小些单词为主且从命名中可以大致读出其功能,例如:fpga_power.v,can_ctrl.v等命名. 2> 顶层top文件的输入输出IO信号使用大些表示,且加上”i/o ...

  6. commons-lang3-RandomUtils

    随机工具类   RandomUtils nextBoolean() 返回一个随机boolean值 nextBytes(int count) 返回一个指定大小的随机byte数组 nextDouble() ...

  7. 【JVM】idea启动项目时候 添加jvm启动参数显示详细日志

    -verbose:class

  8. iOS开发 — (UINaVigationController)导航控制器,界面传值

    UINavigationController 继承于 UIViewController , 以栈的方式管理所 控制的视图控制器 . 至少要有一个被管理的视图控制器 ,这个控制器我们称作导航控制器的根视 ...

  9. python(36)- 测试题

    1.8<<2等于? 32 “<<”位运算 264 132 64 32 16 8 4 2 1 原始位置 0 0 0 0 0 1 0 0 0 想左位移2位 0 0 0 1 0 0 ...

  10. D堆的实现

    实现上一篇博客(http://blog.csdn.net/buleriver/article/details/38469977)说的D堆.假设把mD设置成2.D堆就退化成二叉堆,也就是说.二叉堆是D堆 ...