MongoDB 操作手冊CRUD 事务 两步提交
运行两步提交
概述
这部分提供了多记录更新或者多记录事务。使用两步提交来完毕多记录写入的模板。
另外。能够扩展此方法来提供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 事务 两步提交的更多相关文章
- MongoDB 操作手冊CRUD插入
插入操作 插入记录 1.插入一条记录 db.testData.insert({num:1,name:'a'}); 结果 WriteResult({ "nInserted" : 1 ...
- MongoDB 操作手冊CRUD查询指针
枚举遍历指针 概述 前面已经讲过,db.collection.find()假设没有指定给一个var声明的变量.将自己主动枚举前20条记录. 手动枚举指针 在mongo控制台中.将查询赋给一个var声明 ...
- MongoDB 操作手冊CRUD 删除 remove
删除记录 概述 在MongoDB中,db.collection.remove()方法用于删除集合中的记录.能够删除全部记录,删除全部符合条件的记录.或者是仅删除一条记录. 删除全部记录 删除一个集合中 ...
- MongoDB 操作手冊CRUD 更新 update
改动记录 概述 MongoDB提供了update()方法用于更新记录. 这种方法接受下面參数: 一个更新条件的JSON对象用于匹配记录,一个更新操作JSON对象用于声明更新操作,和一个选项JS ...
- 分布式事务 & 两阶段提交 & 三阶段提交
可以参考这篇文章: http://blog.csdn.net/whycold/article/details/47702133 两阶段提交保证了分布式事务的原子性,这些子事务要么都做,要么都不做. 而 ...
- 分布式事务 spring 两阶段提交 tcc
请问分布式事务一致性与raft或paxos协议解决的一致性问题是同一回事吗? - 知乎 https://www.zhihu.com/question/275845393 分布式事务11_TCC 两阶段 ...
- 聊一聊 MySQL 中的数据编辑过程中涉及的两阶段提交
MySQL 数据库中的两阶段提交,不知道您知道不?这篇文章就简单的聊一聊 MySQL 数据库中的两阶段提交,两阶段提交发生在数据变更期间(更新.删除.新增等),两阶段提交过程中涉及到了 MySQL 数 ...
- 转载:mongodb的两阶段提交实战
项目中用到了mongodb(3.x版本),业务上需要操作mongodb的多个collections,希望要么同时操作成功,要么回滚操作保持数据的一致性,这个实际上要求在mongodb上实现事务功能,在 ...
- MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】
概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...
随机推荐
- select * from 为什么效率低?
sql优化有很重要的一项叫做列裁剪(column pruning).如果不考虑索引,sql的执行算法大概分为sort-base和hash-base,不论是哪种,多出来的列都会带来很多无用的计算. “* ...
- Vue列表渲染,改变数据视图层监测不到的问题
由于 JavaScript 的限制, Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue 当你修改数组的长度时,例 ...
- PHP的json_encode()函数的引号
PHP的json_encode()函数的引号 (1)数组的索引和值都使用双引号 $a = ["id"=>1,"age"=>12,"name ...
- 模块化开发(seajs)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- luogu P1310 表达式的值
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- Myeclipse 出现了Could not generate DH keypair 错误
在myeclipse下安装svn插件,出现了Could not generate DH keypair,这么一个错误. 这个问题困扰了我半天时间,各种百度也找不到答案,或许是百度能力问题吧.百度出来的 ...
- java IOUtils下载图片
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp ...
- 从零开始开发iPhone,教你如何在真机调试iPhone应用程序
对于真机调试,首先要在苹果网站上注册APP ID,以及购买iPhone Develop Program(iDP) 开发者授权,99美元.然后要创建证书请求CSR,创建步骤如下:设置OCSP和CRL为关 ...
- zerorpc的安装
1.简介及安装 rpc使构建分布式系统简单许多,在云计算的实现中有很广泛的应用 rpc可以是异步的 python实现rpc,可以使用标准库里的SimpleXMLRPCServer,另外zerorpc是 ...
- 渗透测试思路 | Linux下自动化搭建FakeAP,劫持用户在Portal认证下的所有流量
如何在linux下搭建一个fakeap,使得portal认证下的用户无法发现连接你的假AP,并且能够正常上网.先说一下portal认证.无线WIFI认证方式主要有wpa2 和 open两种,而port ...