MySQL事务隔离级别主要是四种:读未提交、读已提交、可重复读、串行化,下面重点详解MyQL事务隔离级别@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) | 否 | 否 | 否 |
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》