MySQL事务隔离级别详解(4大隔离级别图解)

文摘   2024-09-08 19:56   四川  

关注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、中间件...等必考题答案详解。


需要以上架构专题&面试答案的同学,加我微信即可领取!


添加时备注:资料






mikechen的架构笔记
十余年BAT架构经验倾囊相授!
 最新文章