关注△mikechen的架构笔记△,十余年BAT架构经验倾囊相授
大家好,我是mikechen。
MySQL事务隔离级别主要是四种:读未提交、读已提交、可重复读、串行化,下面重点详解MyQL事务隔离级别@mikechen
最新mikechen原创超30万字《阿里架构师进阶专题合集》和《最全大厂面试题及答案总结》,请关注本公众号【mikechen的架构笔记】,后台回复:资料,即可领取。
MySQL事务隔离级别
1.read uncommitted(读未提交)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。
读未提交会产生的问题:脏读、不可重复读、幻读,下面我会单独来详解什么是脏读、不可重复读、幻读。
读未提交这种隔离级别,很少应用到实际场景,因为会产生脏读等致命问题。
2. read committed(读已提交)
为了避免脏读,数据库有了比读未提交更高的隔离级别,即已提交读。
一个事务提交之后,它做的变更才会被其他事务看到,只能读取到已经提交的数据,这就是读已提交。
这是大多数数据库系统的默认隔离级别,但不是MySQL默认的,是Oracle的默认级别。
【会产生的问题】:不可重复读、幻读。
3.repeatable read(可重复读)
可重复读:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。
也就是说:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。
可重复读是MySQL InnoDB默认级别,在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。
【会产生的问题】:幻读。
4. serializable(串行化)
串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。
串行化:一般不会使用,它会给每一 行读取的数据加锁,造成大量的等待和锁冲突。
【会产生的问题】:可以解决所有问题。
事务隔离级别引发问题
MySQL事务隔离级别会出现脏读、不可重复读、幻读等问题,所以下面接着详解这些问题。
1.脏读
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。
一个事务读取到另一个事务未提交的更新数据,这就是脏读。
如下图所示:
2.不可重复读
在同一个事务中,多次读取同一数据返回的结果不同,如下图所示:
不可重复读和脏读不同的是:这里读取的是已经提交过后的数据。
3.幻读
幻读是针对数据插入(INSERT)操作来说的,就是:一个事务读到另一个事务已提交的 insert 数据。
如下图所示:
比如:统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
MySQL事务隔离级别总结
事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)是是是
不可重复读(read-committed)否是是
可重复读(repeatable-read)否否是
串行化(serializable)否否否
以上
最后送大家一个福利:
送我原创超30万字阿里架构师进阶专题合集。
以及给大家整理最全大厂Java面试题及答案详解,包含:Java、多线程、JVM、Spring、MySQL、Redis、中间件...等必考题答案详解。
需要以上架构专题&面试答案的同学,加我微信即可领取!
添加时备注:资料