深入浅出分布式技术原理
陈现麟
伴鱼技术中台负责人,前小米工程师
21241 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
深入浅出分布式技术原理
15
15
1.0x
00:00/00:00
登录|注册

24|事务(三):隔离性,正确与性能之间权衡的艺术

两阶段锁(2PL)
读写锁
互斥锁
写倾斜(Write Skew)
幻读(Phantom Read)
丢失更新(Loss of Update)
不可重复读/读倾斜(Nonrepeatable Read/Read Skew)
脏读(Dirty Read)
脏写(Dirty Write)
快照隔离(Snapshot Isolation)
串行化(Serializable)
可重复读(Repeatable Read)
读已提交(Read Committed)
读未提交(Read Uncommitted)
数据库:需要磁盘持久化,操作慢,影响性能
应用程序:通常使用锁控制内存操作
银行转账业务中的写倾斜例子
理解隔离性的实现原理
学习避免异常情况的方法
掌握隔离级别和异常情况
避免并发(单线程顺序执行)
可序列化快照隔离(SSI)
多版本并发控制(MVCC)
间隙锁(Next-Key Locking)
谓词锁(Predicate Lock)
锁机制
原子比较和设置(CAS)
显式加锁(select for update)
使用数据库原子写操作
提升隔离级别
异常情况
SQL-92 隔离级别
与应用程序并发控制的对比
定义:确保多个事务并发执行时不相互影响
6. 思考题
5. 总结
4. 隔离性的实现方式
3. 如何避免异常情况
2. 隔离级别与异常情况
1. 事务隔离性概念
事务隔离性:正确与性能之间权衡的艺术

该思维导图由 AI 生成,仅供参考

你好,我是陈现麟。
通过上节课的学习,我们掌握了通过 2PC 实现分布式事务原子性的技术原理,并且也明白了 2PC 在可用性等方面存在的问题,这些知识能够帮助我们在极客时间的架构选型中,做出正确的选择。
同时,我们还讨论了事务原子性的定义,区分出了事务的原子性并不等价于操作系统里面的原子操作,事务的原子性只定义了操作的不可分割性,而不关心多个事务是否由于并发相互竞争而出现错误,那么在本节课中,我们就一起来讨论事务并发执行的问题,即事务的隔离性。
我们先一起来讨论隔离性的级别和各个隔离级别可能出现的异常情况,然后分析在业务代码中,如何避免异常情况的出现,最后通过讨论隔离性的实现方式,让你进一步理解隔离级别。

什么是隔离性

隔离性定义的是,如果多个事务并发执行时,事务之间不应该出现相互影响的情况,它其实就是数据库的并发控制。可能你对隔离性还有点陌生,其实在编程的过程中,隔离性是我们经常会碰到的一个概念,下面我们就具体讨论一下。
在应用程序的开发中,我们通常会利用锁进行并发控制,确保临界区的资源不会出现多个线程同时进行读写的情况,这其实就对应了事务的最高隔离级别:可串行化,它能保证多个并发事务的执行结果和一个一个串行执行是一样的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了事务隔离性的重要性以及不同隔离级别可能出现的异常情况,包括脏写、脏读、不可重复读、丢失更新、幻读和写倾斜。随后,文章提出了针对每种异常情况的具体解决方案,如提升隔离级别、使用原子操作、显式加锁等。此外,文章还探讨了事务隔离性的实现方式,包括通过锁、两阶段锁、谓词锁、多版本并发控制(MVCC)等方法来确保事务的隔离性。 在业务开发过程中,了解隔离级别及异常情况有助于避免潜在的问题。文章通过深入浅出的方式,帮助读者全面理解了事务隔离性的重要性、异常情况及解决方案,以及实现隔离性的多种方法。这对于开发人员在选择数据库隔离级别、避免异常情况以及实现隔离性都具有指导意义。 总的来说,本文为读者提供了全面的事务隔禅性知识,帮助他们在业务开发中更好地理解和应用隔离级别,以及解决相关异常情况的方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出分布式技术原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:幻读和不可重复读有什么区别? 幻读和不可重复读,都是在一个事务内读取两次,两次读到的结果是不同的。问题的现象是一样的,应该是相同的啊。 Q2:脏读和不可重复读,在业务层面都是“脏读”吗? 文中:A “其二,对于脏读,。。。,如果业务中不能接受脏读,那么XXX”。 B “其三,对于不可重复读或读倾斜,。。。,如果业务中不能接受脏读,那么XXX。” 这两种情况,在业务层面都认为是“脏读”,确实如此吗?还是笔误? Q3:隔离性实现方面,是从数据库实现的角度来讲的吗? 或者也包括从业务代码的角度?

    作者回复: Q1:不可重复读是指在一个事务内,对同一个值的两次读取得到不同的值,幻读是指对同一个查询条件的两次查询,得到不同的结果。 幻读和不可重复读虽然是异常情况,但是读取的数据都是已提交的,而脏读是指读到未提交的数据。 Q2:是的,已经修复了 Q3:异常避免是从业务层工程师应用层面聊的,隔离性实现是让大家更好理解隔离性的

    2022-03-28
    3
  • 不吃辣👾
    老师,上一节课中2PC能保证原子性,但是不能保证可见性。这里的可见性与隔离级别有关系吗?属于哪种隔离级别呢?

    作者回复: 是的,可见性是由隔离性来控制的,不同的隔离级别有不同的隔离性。在课程“一致性与共识(三)”中详细的讨论。

    2022-04-11
  • 黄春煊
    银行转账记录写倾斜的例子: 一个人的账户余额为100,现在有两个事务,事务A:转账80,事务B:转账30。在检查的时候,两个事务都符合条件,但是在运行的时候,却发现,最后不满足账户余额大于0的要求
    2023-02-14归属地:湖北
  • 蜜汁炒酸奶
    请教老师一下,看到文章中的表格中说 可重复读可能产生 写倾斜,这是后来有标准什么的将其更新了么? 我目前仅在《A Critique of ANSI SQL Isolation Levels》中看到有说 可重复读 不会产生 写倾斜。 目前能找到的说 可重复读 会产生写倾斜的是文章 https://vladmihalcea.com/a-beginners-guide-to-read-and-write-skew-phenomena/。 同时看到有些文章说 像MySQL 中的 可重复度级别 其实质是 快照隔离 ,这样一来,用上面文章中的结论证明 可重复读可能产生写倾斜 反而又显得不够充分。
    2022-07-05
  • 郎思明
    select for upate 就算没有找到符合条件的数据,也是会加加间隙锁的。不会有问题
    2022-07-03
    1
  • javaadu
    事务这块挺不好理解,还得仔细研究
    2022-07-02
  • roman
    请教老师 “首先,如果数据库提供了原子写操作,那么一定要避免在应用层代码中,进行“读-修改-写”操作,应该直接通过数据库的原子操作执行,避免更新丢失的问题。例如关系数据库中的 udpate table set value = value + 1 where key = * ,MongoDB 中的 $set、$unset 等操作。” 如果只考虑单机 代码层加锁 会导致更新丢失的问题吗
    2022-06-08
  • roman
    请教老师: “首先,如果数据库提供了原子写操作,那么一定要避免在应用层代码中,进行“读-修改-写”操作,应该直接通过数据库的原子操作执行,避免更新丢失的问题。例如关系数据库中的 udpate table set value = value + 1 where key = * ,MongoDB 中的 $set、$unset 等操作。”
    2022-06-08
  • GEEKBANG_1973776
    能否解释下为什么在可重复读和快照隔离下,可以解决丢失更新问题,因为感觉丢失更新是业务层面先读再写的并发导致,数据库层面怎么检测并发写的值逻辑有问题
    2022-06-04
  • 123
    请教老师:可重复读和快照隔离是如何解决丢失更新问题的?
    2022-05-03
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部