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

13 | 隔离性:为什么使用乐观协议的分布式数据库越来越少?

王磊 2020-09-07
你好,我是王磊,你也可以叫我 Ivan。
我们在 11、12 两讲已经深入分析了读写冲突时的控制技术,这项技术的核心是在实现目标隔离级别的基础上,最大程度地提升读写并发能力。但是,读写冲突只是事务冲突的部分情况,更多时候我们要面对的是写写冲突,甚至后者还要更重要些。
你可能经常会听到这类说法,“某某网站的架构非常牛,能抗住海量并发”“某某网站很弱,搞个促销,让大家去抢红包,结果活动刚开始 2 分钟系统就挂了”。其实,要想让系统支持海量并发,很重要的基础就是数据库的并发处理能力,而这里面最重要的就是对写写冲突的并发控制。因为并发控制如此重要,所以很多经典教材都会花费大量篇幅来探讨这个问题,进而系统性地介绍并发控制技术。在这个技术体系中,虽然有多种不同的划分方式,但最为大家熟知就是悲观协议和乐观协议两大类。
TiDB 和 CockroachDB 的流行一度让大家对于乐观协议这个概念印象深刻。但是,经过几年的实践,两款产品都将默认的并发控制机制改回了悲观协议。他们为什么做了这个改变呢?我们这一讲,专门来探讨什么是乐观控制协议,以及为什么 TiDB 和 CockroachDB 不再把它作为默认选项。

并发控制技术的分类

首先,无论是学术界还是工业界,都倾向于将并发控制分为是悲观协议和乐观协议两大类。但是,这个界限在哪,其实各有各的解释。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《分布式数据库30讲》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥19.9
立即订阅
登录 后留言

精选留言(5)

  • 扩散性百万咸面包
    老师感觉这里没说清楚:
    TiDB在2PC prewrite阶段会给每一行加锁,这个锁是局部性的,怎么理解局部性?意思是说这个加锁只是这个事务的单方面行为,而没有通过数据库的锁管理器等组件吗?因为我看到TiDB是会观察所有加锁请求是否成功的,感觉这好像已经算是做全局性的有效验证了?要怎样加锁才是全局性的有效验证呢?

    作者回复: 局部性是说,只要局部加锁成功,就开始局部的写入了。TiDB的乐观锁也不是在所有记录加锁成功以后,才写入新的数据版本。如果是,那还会因为事务冲突多而频繁回滚吗?再想想:)

    怎么加锁才是全局有效性验证?TiDB后来增加的悲观锁就是例子。这个加锁动作是统一的,只要有一条记录加锁不成功,就不会启动任何写入动作。

    2020-09-10
    2
  • 春风
    老师,TiDB全局性验证是否是增加了一轮共识算法的时间

    作者回复: 是的,因为TiDB的悲观锁是要写一个实际的占位符,并且必须成功后,才能开始原有的乐观锁处理过程,所以就会增加一轮共识算法时间。

    2020-09-07
    1
  • feihui
    老师,关于你在留言中说到的锁,是不是可以理解mysql inodb 引擎的写锁也是乐观锁?毕竟也只是在访问的时候才会加锁
    2020-09-12
  • 真名不叫黄金
    老师,你好,有一个问题想请教一下:
    Spanner 在文档中称自己的事务是基于悲观锁的,但是其实它也是将 Writes 缓存住的,在 commit 时一次性获取锁、完成两阶段提交,它在执行 DML 时并没有检测冲突,Spanner 在提交时采用伤停等待策略,实践中确实可能会带来冲突时很多事务的大量 abort 和 retry。
    按照老师文中的标准,Spanner 其实是一种乐观事务对吗?
    2020-09-09
  • 扩散性百万咸面包
    一个非常典型的例子就是 select for update。这是一个显式的加锁操作,或者说是显式的方式进行有效性确认,广义的乐观协议都不提供严格的 RVW,所以也就无法支持这个操作。
    这句话没懂,广义的乐观协议不是支持加锁吗(比如TiDB对每一行修改前加锁)?还是说像TiDB这样的,它的加锁不是显式的,只能在percolator 2PC中加锁,所以不支持这种显式加锁的。
    2020-09-07
收起评论
5
返回
顶部