分布式数据库30讲
王磊
光大银行首席数据架构师
新⼈⾸单¥19.9
2205 人已学习
课程目录
已更新 12 讲 / 共 33 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|为什么要学习分布式数据库?
免费
基础篇 (8讲)
01|什么是分布式数据库?
02|强一致性:那么多数据一致性模型,究竟有啥不一样?
03|强一致性:别再用BASE做借口,来看看什么是真正的事务一致性
04 | 架构风格:NewSQL和PGXC到底有啥不一样?
05 | 全局时钟:物理时钟和逻辑时钟你Pick谁?
06 | 分片机制:为什么说Range是更好的分片策略?
07 | 数据复制:为什么有时候Paxos不是最佳选择?
08 | 基础篇大串讲:重难点回顾+思考题答疑+知识全景图
开发篇 (3讲)
09|原子性:2PC还是原子性协议的王者吗?
10 | 原子性:如何打破事务高延迟的魔咒?
11|隔离性:读写冲突时,快照是最好的办法吗?
分布式数据库30讲
15
15
1.0x
00:00/00:00
登录|注册

09|原子性:2PC还是原子性协议的王者吗?

王磊 2020-08-28
你好,我是王磊,你也可以叫我 Ivan。今天,我要和你讲一讲分布式事务的原子性。
在限定“分布式”范围之前,我们先认识一下“事务的原子性”是啥。
如果分开来看的话,事务可以理解为包含一系列操作的序列,原子则代表不可分割的最小粒度。
而合起来看的话,事务的原子性就是让包含若干操作的事务表现得像一个最小粒度的操作。这个操作一旦被执行,只有“成功”或者“失败”这两种结果。这就好像比特(bit),只能代表 0 或者 1,没有其他选择。
为什么要让事务表现出原子性呢?我想举个从 ATM 取款的例子。
现在,你走到一台 ATM 前,要从自己 50,000 元的账户上取 1,000 元现金。当你输入密码和取款金额后, ATM 会吐出 1,000 块钱,同时你的账户余额会扣减 1,000 元;虽然有些时候,ATM 出现故障,无法吐钞,系统会提示取款失败,但你的余额还会保持在 50,000 元。
总之,要么既吐钞又扣减余额,要么既不吐钞又不扣减余额,你拿到手的现金和账户余额总计始终是 50,000 元,这就是一个具有原子性的事务。
显然,吐钞和扣减余额是两个不同的操作,而且是分别作用在 ATM 和银行的存款系统上。当事务整合了两个独立节点上的操作时,我们称之为分布式事务,其达成的原子性也就是分布式事务的原子性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《分布式数据库30讲》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(10)

  • 扩散性百万咸面包
    老师不是很理解为什么TCC就不用像2PC那样加锁和记日志了呢?TCC如何保证事务隔离性呢?如果有其他代码修改同一行数据怎么办?

    作者回复: TCC可使用的手段更灵活,不限于数据库锁了。比如,可以增加一个“未冻结余额”字段,初始值和余额一样,一阶段时直接在这个字段上扣减金额,这样后发生的事务如果发现剩下的“未冻结余额”不够,就会返回失败,这样多事务就可以协同了。

    2020-08-28
    2
    1
  • chenchukun
    个人的理解是paxos可以用于解决2PC的单点故障和数据不一致问题,协调者和参与者利用paxos实现多副本一致,在节点宕机后可切换到副本节点继续完成2PC流程。
    今天讲的内容,Percolator很好理解,很好的解决了传统2PC存在的问题。
    但是对于PGXC的解决方案还是不明白,几个问题请教一下老师,或者请老师帮忙推荐一下相关学习资料。
    1、PGXC中分布式事务的实现是不是也是基于单体数据库的XA事务来实现的?像MYSQL的XA要避免脏读是需要工作在可串行级别下的,若是使用XA如何解决XA的性能问题呢?
    2、关于利用GTM实现资源分配这点不是很理解,是指由GTM负责从SQL中解析出事务要读写的数据,然后判断读写冲突吗?
    3、在MYSQL中事务在提交前是不会写binlog的,是不是意味着MYSQL实现分布式数据库就没办法利用binlog进行主备同步了,因为若2PC的提交阶段,某个节点宕机后不恢复,没办法利用备库继续执行。
    4、PGXC类型的分布式数据库,是不是需要实现在并发执行多个事务时,保证所有节点按照相同的顺序执行SQL?这个问题看起来也很复杂,没想明白。
    2020-08-28
    1
  • myrfy
    老师,GlodenDB如何避免全局管理器成为瓶颈呢?
    2020-09-03
  • 南国
    感觉2PC和Basic-Paxos的过程好像啊,第一阶段的区别是2PC需要全部的回复,而Paxos只需要一半以上的Acceptor回复;第二阶段就几乎一模一样了。至于为什么第一阶段有这样的区别,大概是2PC的每一个节点职能(包括数据)都不相同,要满足一致性约束必须全部的节点的同意;而Paxos抛去每个节点角色不同,它们存储的数据都一样(理想中一致,实际不一致,Paxos会出现日志空缺),为了全局一致,一次同意一半以上就可以了,因为两次一半以上一定是有交集的,这保证了paxos需要的一致性。

    至于它们的关系,我觉得它们都是共识算法(consensus),适用前提区别在于节点职能是否相同。
    2020-09-01
  • qinsi
    关于Percolator,文中提到“在 lock 字段上写入了标识信息的记录就是私有版本,只有当前事务能够操作”,而在例子中又有其他事务读到了私有版本的数据,这是为什么呢?

    作者回复: 如果加了secondary锁,其他事务确实会读取到,是为了追溯事务状态,再决定读取哪个版本。而在异步线程或第一个读操作维护好状态后,就不再是私有版本了,所以我们说“通常其他事务不能读写”

    2020-08-30
  • tt
    还有,最近有一个业务,涉及到两个的系统,业务也要求两个系统必须都成功或者都失败,通过报文交互,正好适合TCC这种业务层面的协议
    2020-08-29
  • tt
    我的理解是2PC中的任何一个节点都是逻辑的,可以有多个物理节点组成,PAXOS可以让这个逻辑节点内部的值达成一致,就是各种一致性模型。

    而2PC是解决分布式的事物,参与的各个节点的值是不一样的,比如小明节点的余额是2900,而小红节点的余额是2300
    2020-08-29
  • 李鑫磊
    2PC 解决的是:
    1)小明账户 - 100;
    2)小红账户 + 100;
    3)小明和小红账户信息存储在不同的数据库实例中;
    Basic Paxos 解决的问题:
    1)客户端不停的有 a=xxx 这样的操作;
    2)Basic Paxos 就是让多个节点就 x 的值达成一致;
    3)说白了就是数据在多副本之间的复制;
    不知道我的理解对不对?
    2020-08-28
  • piboye
    paxos是共识算法,是对同一份数据的达成共识。2pc更多是为了达成的多份不同数据修改的原子性。不知道这样理解对不?
    2020-08-28
  • 伟伟哦
    老师课程 TCC、3cp、2pc这些,或者以后课程, 可以接入下代码吗?
    2020-08-28
    1
收起评论
10
返回
顶部