什么情况,写了 5 年的 CRUD,还搞不清楚 Mysql 的事务隔离级别,难怪第一面就被刷下来。
一个 5 年经验的粉丝,在一个公司干了 5 年,觉得自己特厉害,什么都能搞定,结果每次一到技术面就被刷。问我该怎么办,原本我是想让他系统学习一下,但是他已经找了 2 个月工作了,急需要快速找到一个工作稳定下来。所以我只能把之前整理的 80W 字的面试文档先发给他,让他先突击一下。这个面试文档覆盖面特别广,而且每个问题都有很清晰完整的回答,有需要的小伙伴可以在评论区置顶中去领取。
一、问题解析
回到正题。
事务隔离级别,是为了解决多个并行事务竞争导致的数据安全问题的一种规范。具体来说,多个事务竞争可能会产生三种不同的现象。
1. (如图)假设有两个事务 T1/T2 同时在执行,T1 事务有可能会读取到 T2 事务未提
交的数据,但是未提交的事务 T2 可能会回滚,也就导致了 T1 事务读取到最终不一
定存在的数据产生脏读的现象。
2. (如图)假设有两个事务 T1/T2 同时执行,事务 T1 在不同的时刻读取同一行数据的时候结果可能不一样,从而导致不可重复读的问题。
3. (如图),假设有两个事务 T1/T2 同时执行,事务 T1 执行范围查询或者范围修改的过程中,事务 T2 插入了一条属于事务 T1 范围内的数据并且提交了,这时候在事务 T1 查询发现多出来了一条数据,或者在 T1 事务发现这条数据没有被修改,看起来像是产生了幻觉,这种现象称为幻读。
而这三种现象在实际应用中,可能有些场景不能接受某些现象的存在,所以在 SQL 标准中定义了四种隔离级别,分别是:
4. 读未提交,在这种隔离级别下,可能会产生脏读、不可重复读、幻读。
5. 读已提交(RC),在这种隔离级别下,可能会产生不可重复读和幻读。
6. 可重复读(RR),在这种隔离级别下,可能会产生幻读
7. 串行化,在这种隔离级别下,多个并行事务串行化执行,不会产生安全性问题。
这四种隔离级别里面,只有串行化解决了全部的问题,但也意味着这种隔离级别的性能是最低的。
在 Mysql 里面,InnoDB 引擎默认的隔离级别是 RR(可重复读),因为它需要保证事务 ACID 特性中的隔离性特征。好了,今天的分享就到这里,在面试的时候大家还有遇到哪些比较难的问题,欢迎在评论区留言。
三、粉丝福利
我是浮生,一个工作十四年经验的Java程序员!
最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份80W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取