摘要

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(参与者)

  1. 请求阶段

    coordinator通知workers准备提交或者取消事务。workers返回应答信号,当所有的workers都返回应答信号了,再进行下一阶段。
  2. 提交阶段

    coordinator根据请求阶段收集到的所有结果,当所有的结果都为提交的时候,就通知所有的workers提交事务,否则取消。

参考

https://docs.mongodb.com/manual/core/write-operations-atomicity/

最新文章

  1. 在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?
  2. Python 中的枚举类型~转
  3. Python单元测试和Mock测试
  4. ASP.NET MVC4系列验证机制、伙伴类共享源数据信息(数据注解和验证)
  5. 走进Linux之systemd启动过程
  6. NYOJ 52-无聊的小明
  7. 基于HtmlUnit的模板的网页数据抽取
  8. HTML5学习笔记(一):HTML简介
  9. winForm 中子窗体关闭但不释放对象,方便下次继续打开
  10. QueryPerformanceFrequency 和 QueryPerformanceCounter用法
  11. 你需要知道的九大排序算法【Python实现】之冒泡排序
  12. linux搭建邮件服务器
  13. 优秀开源软件学习系列(一)——从零学习Spring4以及学习方法分享
  14. TestNG并行测试
  15. Appium+Python自动化 4 -appium元素定位
  16. VS2017中用C#调试DLL
  17. 简单几步即可判断Linux系统有无被DDOS攻击的方法
  18. Maven依赖及范围
  19. JS简单验证
  20. zabbix的启动和关闭脚本

热门文章

  1. postgresql 53300错误
  2. 感动到哭的SBT下载
  3. Linux-网络基础
  4. 《团队作业第三、第四周》五小福团队作业--Scrum 冲刺阶段--Day7
  5. 1062 Text Reverse
  6. 为什么在Python里推荐使用多进程而不是多线程?
  7. linux 做了raid后,硬盘坏了更换问题
  8. 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)
  9. 漏测BUG借鉴
  10. Mybatis_4.DBUtil.java