深刻理解mysql四种隔离级别

一.四种隔离级别

1.read uncomitted(读取未提交)
A事务可以读取到B事务未提交的数据,如果B事务rollback,那么A事务此前读取到的数据就是没有意义,也称为脏读。

2.read committed(读取已提交)
A事务只能读取已提交的数据,解决了read uncommitted中的脏读问题,但是A事务在两次读的过程中,可能会出现B提交事务的情况,导致A的两次读操作结果不一致,也称为不可重复读。

3.repeatable read(可重复读)
这是mysql的默认隔离级别,它确保同一个事务的多个实例在并发读取数据时,会看到相同的数据行。但是在读取过程中,若B事务在A事务的读取范围内添加了数据,A事务在commit之前都无法读取B事务添加的数据,也称为“幻读”

4.serializable(串行化)
最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决“幻读”的问题。它在每个读的数据行上加上共享锁,可能会导致大量的超时等待和锁竞争。

二.验证

表内容:
在这里插入图片描述

1.read uncommitted;
在这里插入图片描述
通过set session transaction isolation level +“隔离级别” 设置当前会话的隔离级别
检查隔离级别
select @@transaction_isolation mysql8.0以后
select @@tx_isolation mysql8.0以前

A、B开启事务(注:左A右B)
A查询初识数据
B更新一条数据 A再次读取,读取到B更新但未提交的数据
Brollback A再次读取 数据发生更改 出现“脏读”
在这里插入图片描述在这里插入图片描述
2.read committed
A、B开启事务
A读初识数据
B更新数据 A再次读取并没有发生变化 解决了“脏读”问题

在这里插入图片描述
当Bcommit后,A再次读取,发现前后两次读取数据不一致,出现不可重复读问题。
在这里插入图片描述
3.repeatable
A、B开启事务
A在B commit前后,数据都未改变,解决了不可重复读问题
在这里插入图片描述
此时,B insert一条数据,A无法读取到B添加的数据,此时出现“幻读”现象
在这里插入图片描述

A commit之后 可以读到最新的数据
在这里插入图片描述

4.serializable
A隔离级别设为serializable
AB开启事务
B insert出现等待,直到超时
在这里插入图片描述
Acommit;B成功插入
Bcommit后 A读取到完整的数据在这里插入图片描述

发布了16 篇原创文章 · 获赞 1 · 访问量 1727

猜你喜欢

转载自blog.csdn.net/qq_42584241/article/details/105112387