SQL 必知必会
陈旸
清华大学计算机博士
73337 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?

思考问题
隔离级别的影响
正确性与实现无关
模拟幻读
模拟不可重复读
模拟脏读
可串行化
可重复读
读已提交
读未提交
幻读
不可重复读
脏读
高并发访问需求
数据不一致的情况
持久性
隔离性
一致性
原子性
总结
使用MySQL客户端来模拟三种异常
事务隔离的级别
事务并发处理可能存在的异常
事务隔离的重要性
事务的四大特性ACID
初识事务隔离

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

上一篇文章中,我们讲到了事务的四大特性 ACID,分别是原子性、一致性、隔离性和持久性,其中隔离性是事务的基本特性之一,它可以防止数据库在并发处理时出现数据不一致的情况。最严格的情况下,我们可以采用串行化的方式来执行每一个事务,这就意味着事务之间是相互独立的,不存在并发的情况。然而在实际生产环境下,考虑到随着用户量的增多,会存在大规模并发访问的情况,这就要求数据库有更高的吞吐能力,这个时候串行化的方式就无法满足数据库高并发访问的需求,我们还需要降低数据库的隔离标准,来换取事务之间的并发能力。
有时候我们需要牺牲一定的正确性来换取效率的提升,也就是说,我们需要通过设置不同的隔离等级,以便在正确性和效率之间进行平衡。同时,随着 RDBMS 种类和应用场景的增多,数据库的设计者需要统一对数据库隔离级别进行定义,说明这些隔离标准都解决了哪些问题。
我们今天主要讲解事务的异常以及隔离级别都有哪些,如果你已经对它们有所了解,可以跳过本次章节,当然你也可以通过今天的课程快速复习一遍:
事务并发处理可能存在的三种异常有哪些?什么是脏读、不可重复读和幻读?
针对可能存在的异常情况,四种事务隔离的级别分别是什么?
如何使用 MySQL 客户端来模拟脏读、不可重复读和幻读?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了事务隔离的级别以及解决的异常问题,包括脏读、不可重复读和幻读。作者通过实例演示了在MySQL中模拟这些异常的方法,帮助读者快速了解事务隔离的概念、级别和异常情况。隔离级别越低,系统吞吐量越大,但异常问题可能性也更大,需要在性能和正确性上进行权衡和取舍。读者可以通过本文深入了解不同隔离级别对并发性能的影响,以及不可重复读和幻读的区别。整体而言,本文内容详实,适合技术人员快速了解事务隔离的相关知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(79)

  • 最新
  • 精选
  • LJK
    置顶
    老师好,对幻读有些迷惑,从网上看到幻读并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,结果显示不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

    作者回复: 你说的这种情况属于幻读。 当你INSERT的时候,也需要隐式的读取,比如插入数据时需要读取有没有主键冲突,然后再决定是否能执行插入。如果这时发现已经有这个记录了,就没法插入。 官方对幻读的定义是:The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row. (详见: https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html ) 需要说明下,不可重复读 VS 幻读的区别: 不可重复读是同一条记录的内容被修改了,重点在于UPDATE或DELETE 幻读是查询某一个范围的数据行变多了或者少了,重点在于INSERT 所以,SELECT 显示不存在,但是INSERT的时候发现已存在,说明符合条件的数据行发生了变化,也就是幻读的情况,而不可重复读指的是同一条记录的内容被修改了。

    2019-07-15
    7
    108
  • Abyssknight
    关于事务隔离和异常问题的举例不够详细和严谨,具体可以看这个 https://www.liaoxuefeng.com/wiki/1177760294764384/1179611198786848 以下是自己的理解: 读未提交:在这个隔离级别下,事务A会读到事务B未提交的数据,在事务B回滚后,事务A读到的数据无意义,是脏数据,称为 脏读 读已提交:在这个隔离级别下,只有在事务B已提交时,事务A才能读到,如果事务A先查询id为1的记录,之后事务B修改这条记录并提交,事务A再读取,两次结果会不一致,所以不可重复读。 可重复读:在这个隔离级别下,就算事务B的修改已经提交,事务A读到的数据依旧是一致的。当事务B插入一条新数据并提交之后,事务A查询不到当前数据,查询不到就以为不存在,但是事务A却可以更新这条数据成功,并且更新后再次查询,数据出现了。一开始查询不到,但能修改,再次查询又出现了,跟幻觉一样,所以称为 幻读。

    作者回复: 多谢分享

    2019-07-15
    7
    50
  • 未来的胡先森
    关于「隔离级别越高,就越影响系统的并发性能」我的思考: 1、因为隔离级别越高就是越接近串行化操作(隔离级别最高的就是:可串行化)。而串行化操作就是按照事务的先后顺序,排队执行,一个事务操作可能就要等待很久才能执行,并发执行的效率就没有了。 2、隔离就是给资源加锁,隔离级别越低,资源的共享程度就越高,大家都能去取自己需要的资源,而隔离级别高,共享程度越低,以至于一大份资源只能上一个用完了,下一个才能使用。就像免费开放的公园,没有收费的时候,想逛的时候随便哪条小路进去都行,收费了(加锁了),其他地方全拦住,一个人进去看好了,下一个再进去看。 「不可重复读」和「幻读」的区别,老师已在留言区指出了。「不可重复读」就是针对于单独的某条数据同一事务前后读取不一致(被其他事务修改)。「幻读」针对于查询结果集的前后不一致,查询的数据表在事务的执行期间有执行插入删除的操作,导致查询结果的增加或减少。

    作者回复: 解释的很好,大家都可以看下

    2019-08-09
    4
    24
  • JackPn
    老师我感觉幻读也是不了重复读啊,都是一个事务过程中两次读到了另一个事务修改提交后的数据

    作者回复: 首先,不可重复读 和 幻读都是在先后两次读取的时候发现不一致的情况,但是两种读取略有差别: 不可重复读是对于同一条记录内容的“不可重复读” 幻读是对于某一范围的数据集,发现查询数据集的行数多了或者少了,从而出现的不一致。 所以不可重复读的原因是 对于要查询的那条数据进行了UPDATE或DELETE 而幻读是对于要查询的 那个范围的数据集,进行了INSERT。

    2019-07-15
    2
    18
  • L荀
    不可重复读,和幻读例子中事物不用提交么

    作者回复: 一个好问题,一般来说第二个事务需要进行提交。不过在文章中,我将客户端1的隔离级别设置为了 读未提交,因此不论客户端2是否提交,都会对客户端1造成影响。 如果将客户端1的隔离级别设置为 读已提交,或者 可重复度。就需要对客户端2的事务进行提交,这时才会对客户端1在执行的事务产生影响。

    2019-07-15
    9
  • mickey
    我的理解是:隔离性的保证靠锁,隔离级别越高越串行,并行度越低,性能越低。

    作者回复: 不错

    2019-07-18
    7
  • Order
    不可重复读和幻读还不是很理解,老师可以再详细讲讲吗

    作者回复: 不可重复读 VS 幻读的区别: 不可重复读是同一条记录的内容被修改了,重点在于UPDATE或DELETE 幻读是查询某一个范围的数据行变多了或者少了,重点在于INSERT

    2019-07-15
    7
  • ack
    事务的隔离级别是需要通过锁来保证的,想要解决的问题越多,加的锁就越多,从文章也可以看出,当想要解决幻读的时候,需要的隔离级别已经是串行化了。

    作者回复: 对 加锁是底层的实现环节,不同的事务隔离级别对应能解决不同的异常问题。在选择隔离级别的时候,我们要在正确性和性能上进行权衡取舍

    2019-07-15
    3
  • 墨禾
    老师,分库分表是不是可以一定程度上保证隔离性和并发访问呢?

    作者回复: 可以提高并发访问

    2019-07-15
    2
  • 阿斯蒂芬
    老师您好,「事务并发处理可能存在的异常都有哪些?」这个小节中关于「不可重复读」的英文「Nnrepeatable Read」是否应该为「Non-repeatable read」,参考wiki transaction isolation 2.2 https://en.wikipedia.org/wiki/Isolation_(database_systems)

    编辑回复: 嗯嗯,我改下

    2020-02-03
收起评论
显示
设置
留言
79
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部