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

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

MySQL事务隔离级别主要是四种:读未提交、读已提交、可重复读、串行化,下面重点详解MyQL事务隔离级别@mikechen

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

MySQL事务隔离级别

1.read uncommitted(读未提交)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。

读未提交会产生的问题:脏读、不可重复读、幻读,下面我会单独来详解什么是脏读、不可重复读、幻读。

读未提交这种隔离级别,很少应用到实际场景,因为会产生脏读等致命问题。

 

2. read committed(读已提交)

为了避免脏读,数据库有了比读未提交更高的隔离级别,即已提交读。

一个事务提交之后,它做的变更才会被其他事务看到,只能读取到已经提交的数据,这就是读已提交。

这是大多数数据库系统的默认隔离级别,但不是MySQL默认的,是Oracle的默认级别。

【会产生的问题】:不可重复读、幻读。

 

3.repeatable read(可重复读)

可重复读:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。

也就是说:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。

可重复读是MySQL InnoDB默认级别,在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。

【会产生的问题】:幻读。

 

4. serializable(串行化)

串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。

串行化:一般不会使用,它会给每一 行读取的数据加锁,造成大量的等待和锁冲突。

【会产生的问题】:可以解决所有问题。

 

事务隔离级别引发问题

MySQL事务隔离级别会出现脏读、不可重复读、幻读等问题,所以下面接着详解这些问题。

1.脏读

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。

一个事务读取到另一个事务未提交的更新数据,这就是脏读。

如下图所示:

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

2.不可重复读

在同一个事务中,多次读取同一数据返回的结果不同,如下图所示:
MySQL事务隔离级别(4大隔离级别图文详解)-mikechen

不可重复读和脏读不同的是:这里读取的是已经提交过后的数据。

 

3.幻读

幻读是针对数据插入(INSERT)操作来说的,就是:一个事务读到另一个事务已提交的 insert 数据。

如下图所示:
MySQL事务隔离级别(4大隔离级别图文详解)-mikechen

比如:统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

 

MySQL事务隔离级别总结

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法