运行两步提交

概述

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

另外。能够扩展此方法来提供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. window maven安装(六)

    Maven 实战系列之在Windows上安装Maven Maven是一个优秀的构建工具(类似于 Ant, 但比 Ant 更加方便使用),能帮助我们自动化构建过程,从清理.编译.测试到生成报告,再到打包 ...

  2. bzoj 3000 Big Number 估算n!在k进制下的位数 斯特林公式

    题目大意 求n!在k进制下的位数 2≤N≤2^31, 2≤K≤200 分析 作为数学没学好的傻嗨,我们先回顾一下log函数 \(\log_a(b)=\frac 1 {log_b(a)}\) \(\lo ...

  3. Mysql基本操作语句【重要】

    一.对数据库的操作 1.  创建一个库 create database 库名 create database 库名 character set 编码

  4. TStringList的Find,IndexOf和Sort

    procedure TForm1.Button1Click(Sender: TObject); var MyList: TStringList; begin MyList := TStringList ...

  5. LeetCode OJ--Insert Interval **

    https://oj.leetcode.com/problems/insert-interval/ 给出有序的区间来,再插入进去一个,也就是区间合并. 刚开始确立了几个思路,看要插入的区间的start ...

  6. jquery小技巧:使用jquery.confirm和PNotify实现弹出提示和消息提示

    在从UIKIT前端换到BOOSTRAP前端时,一些转换的技巧. https://myclabs.github.io/jquery.confirm/ http://sciactive.github.io ...

  7. HTML-loading动画1

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Babel6.x的安装过程

    1.首先安装babel-cli(用于在终端使用babel) npm install -g babel-cli 2.然后安装babel-preset-es2015插件 npm install --sav ...

  9. Codeforces Gym101502 J-取数博弈

    还有J题,J题自己并不是,套的板子,大家写的都一样,因为大家都是套板子过的,贴一下代码,等学会了写一篇博客... J.Boxes Game 代码: 1 //J. Boxes Game-取数博弈-不会, ...

  10. HDU 2874 Connections between cities(LCA)

    题目链接 Connections between cities LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...