Cassandra与Mongo的事务实现之分布式协议
摘要
NoSql不同于关系型数据库,是分布式存储,因此想要实现关系型数据库中的事务就不是那么简单了。本文结合Cassandra中的paxos和Mongo的two phase commit来谈谈Nosql如何利用分布式协议来实现事务的。
Cassandra
Cassandra的paxos机制在这篇译文中已有详细解释了。
下面时序图方便理解。
注意acceptor节点数量由replicate factor数量决定,quorum个返回就是超过一半的replicate factor。
Cassandra只能通过轻量级事务来实现行层面的原子性和隔离性。因此没有关系型数据库那么丰富的事务操作,如开启事务,提交事务,和回滚
eg.给mike的账户加一块钱,IF就是Cassandra中的关键字,实现事务的。这样可以确保在事务中正确更改miki的账户。但是如果涉及到转账,两行记录,是实现不了的原子性操作的,因为没有回滚机制的。
UPDATE test.bank SET amount = 2
WHERE name = 'mike'
AND id = 123
IF amount = 1
mongo
mongo 的原子性是基于document级别,而document又是可以嵌套的,所以基本可以满足大部分情况的原子性要求。但是如果需要实现多个document的的事务。则需要两阶段协议
2pc(2 phase commit) 两阶段即请求阶段,以及提交阶段。
相比较paxos的Proposer和Acceptor。两阶段协议也包含两种角色,一个是coordinator(协调者),集群中一般只有1个,另外一种角色是workers(参与者)
- 请求阶段
coordinator通知workers准备提交或者取消事务。workers返回应答信号,当所有的workers都返回应答信号了,再进行下一阶段。 - 提交阶段
coordinator根据请求阶段收集到的所有结果,当所有的结果都为提交的时候,就通知所有的workers提交事务,否则取消。
参考
https://docs.mongodb.com/manual/core/write-operations-atomicity/
Cassandra与Mongo的事务实现之分布式协议的更多相关文章
- 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...
- Replication--无法将事务提升为分布式事务,因为在事务中有活动的保存点
场景描述在SQL SERVER 2012上创建事务发布,发布库已搭建为可AWAYSON,分发服务器和发布服务器分离,创建发布时提示“无法将事务提升为分布式事务,因为在事务中有活动的保存点” 解决方法E ...
- 分布式事务(3)---强一致性分布式事务Atomikos实战
分布式事务(1)-理论基础 分布式事务(2)---强一致性分布式事务解决方案 分布式事务(4)---最终一致性方案之TCC 前面介绍强一致性分布式解决方案,这里用Atomikos框架写一个实战的dem ...
- cassandra vs mongo (1)存储引擎
摘要 在MongoDB 初识篇中谈到过Mongo 与 Cassandra的区别,这边再谈谈Mongo与Cassandra的存储引擎差别 概括 存储引擎: 类型 功能 应用 hash 增删改.随机读.顺 ...
- 分布式事务之——tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/73731363 一.背景 有一定分布式开发经验的朋友都知道,产品/项目/系统最初为了 ...
- 【转】分布式事务之——tcc-transaction分布式TCC型事务框架搭建与实战案例
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/73731363 一.背景 有一定分布式开发经验的朋友都知道,产品/项目/系统最初为了 ...
- redis事务机制和分布式锁
Redis事务机制 严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的:Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行. ...
- Redis事务与可分布式锁
1 Redis事务 1.1 Redis事务介绍 l Redis的事务是通过MULTI,EXEC,DISCARD和WATCH这四个命令来完成的. l Redis的单个命令都是原子性的,所以 ...
- AOP事务解决方案和分布式事务方案
http://www.cnblogs.com/jianxuanbing/p/7242254.html http://www.cnblogs.com/jianxuanbing/p/7199457.htm ...
随机推荐
- RabbitMQ 实现远程过程调用RPC
RPC调用的顺序1. 在客户端初始化的时候,也就是SimpleRpcClient类初始化的时候,它会随机的创建一个callback队列,用于存放服务的返回值,这个队列是exclusive的.连接断开就 ...
- CYJian的新春虐题赛
题解: t1: 算了一下发现乘法也是可以莫比乌斯反演的 然后就直接对原式莫比乌斯反演了 大概加法是$\mu {(i)}*f(i)$ 乘法就是$f(i)^{\mu {(i)}}$ 然后这个算法成功达到$ ...
- 记一次WordPress 安装的过程
安装WordPress你我他大家都会,记得10年的时候,哥已经玩转WordPress.dedecms.sns,那为何现在要记一次WordPress安装过程呢? 因为现在不会了! 之前安装都是在Wind ...
- 玩转GET 和 POST
HTTP 基本概念 HTTP Request Methods GET.POST 专业名称是 HTTP Request Methods.但 HTTP Request Methods 不只是 GET 和 ...
- Spring基础知识备案
关于@Value注解不能为静态变量赋值的问题 // eg:(xxx.ooo.value=100) 以下这种方式,来自配置文件的属性值无法注入: public class XxxUtils { @Val ...
- mysql 8.0 密码加密方式的坑
问题:新安装好MySQL 8.0和Navicat之后,连接时总是报: 1251 Client does not support authentication protocol requested by ...
- C++ MD5类封装
c++ md5 算法封装 md5.h #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* T ...
- 【安全性测试】解决关于appscan基于登录会话检测失败问题
有些问题久了忽然就想通怎么解决了,很神奇.这次要说的是,关于appscan无法检测到会话的问题,因为在百度上一直找不到相关的解决方法,这个问题困扰了我很久,今天终于找到方法解决了! 日常配置扫描内容: ...
- Linux正则表达式练习
练习一 1.生成30位的随机口令 [root@centos7 ~]#cat /dev/urandom | tr -dc "[:alnum:]" | head -c30 RJL5qc ...
- ssh网上商城源码
本人承诺源码免费,只是出于前期发布很多免费资源反而落不到好下场,总是被一些人说三道四.就算你去找到资源版本不符合你也运行不起来.如果想要资源加QQ1397617269,或者电话短信1395630164 ...