15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
该思维导图由 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-157108 - 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-15750 - 未来的胡先森关于「隔离级别越高,就越影响系统的并发性能」我的思考: 1、因为隔离级别越高就是越接近串行化操作(隔离级别最高的就是:可串行化)。而串行化操作就是按照事务的先后顺序,排队执行,一个事务操作可能就要等待很久才能执行,并发执行的效率就没有了。 2、隔离就是给资源加锁,隔离级别越低,资源的共享程度就越高,大家都能去取自己需要的资源,而隔离级别高,共享程度越低,以至于一大份资源只能上一个用完了,下一个才能使用。就像免费开放的公园,没有收费的时候,想逛的时候随便哪条小路进去都行,收费了(加锁了),其他地方全拦住,一个人进去看好了,下一个再进去看。 「不可重复读」和「幻读」的区别,老师已在留言区指出了。「不可重复读」就是针对于单独的某条数据同一事务前后读取不一致(被其他事务修改)。「幻读」针对于查询结果集的前后不一致,查询的数据表在事务的执行期间有执行插入删除的操作,导致查询结果的增加或减少。
作者回复: 解释的很好,大家都可以看下
2019-08-09424 - JackPn老师我感觉幻读也是不了重复读啊,都是一个事务过程中两次读到了另一个事务修改提交后的数据
作者回复: 首先,不可重复读 和 幻读都是在先后两次读取的时候发现不一致的情况,但是两种读取略有差别: 不可重复读是对于同一条记录内容的“不可重复读” 幻读是对于某一范围的数据集,发现查询数据集的行数多了或者少了,从而出现的不一致。 所以不可重复读的原因是 对于要查询的那条数据进行了UPDATE或DELETE 而幻读是对于要查询的 那个范围的数据集,进行了INSERT。
2019-07-15218 - L荀不可重复读,和幻读例子中事物不用提交么
作者回复: 一个好问题,一般来说第二个事务需要进行提交。不过在文章中,我将客户端1的隔离级别设置为了 读未提交,因此不论客户端2是否提交,都会对客户端1造成影响。 如果将客户端1的隔离级别设置为 读已提交,或者 可重复度。就需要对客户端2的事务进行提交,这时才会对客户端1在执行的事务产生影响。
2019-07-159 - mickey我的理解是:隔离性的保证靠锁,隔离级别越高越串行,并行度越低,性能越低。
作者回复: 不错
2019-07-187 - Order不可重复读和幻读还不是很理解,老师可以再详细讲讲吗
作者回复: 不可重复读 VS 幻读的区别: 不可重复读是同一条记录的内容被修改了,重点在于UPDATE或DELETE 幻读是查询某一个范围的数据行变多了或者少了,重点在于INSERT
2019-07-157 - ack事务的隔离级别是需要通过锁来保证的,想要解决的问题越多,加的锁就越多,从文章也可以看出,当想要解决幻读的时候,需要的隔离级别已经是串行化了。
作者回复: 对 加锁是底层的实现环节,不同的事务隔离级别对应能解决不同的异常问题。在选择隔离级别的时候,我们要在正确性和性能上进行权衡取舍
2019-07-153 - 墨禾老师,分库分表是不是可以一定程度上保证隔离性和并发访问呢?
作者回复: 可以提高并发访问
2019-07-152 - 阿斯蒂芬老师您好,「事务并发处理可能存在的异常都有哪些?」这个小节中关于「不可重复读」的英文「Nnrepeatable Read」是否应该为「Non-repeatable read」,参考wiki transaction isolation 2.2 https://en.wikipedia.org/wiki/Isolation_(database_systems)
编辑回复: 嗯嗯,我改下
2020-02-03