脏读、幻读和不可重复读理解

脏读、幻读和不可重复读理解

什么是脏读、幻读和不可重复读

脏读

img

脏读是指事务读取到其他事务没提交的数据。

上述案例:事务B将“张三”更新为“张老三”,此时事务还未提交。与此同时,事务A读取了该条记录,事务A读到的值是“张老三”,事务B进行回滚。这时数据库里存储的这条数据name依然是“张三”,但是事务B读到的却是“张老三”,这个案例就是典型的脏读。

不可重复读

img

不可重复读是指在同一次事务中前后查询不一致的问题。

上述案例:事务A查询id=1的数据,查询到的名字为“张三”,事务B修改了这条数据的name为“张老三”,并且提交了事务,事务A又一次的查询了该条记录,发现name被修改了,这就是不可重复读。

幻读

幻读是指一次事务中前后数据量发生变化用户产生不可预料的问题。

上述案例:事务A查询stu表,并删除了该表的数据。事务B紧接其后新增了数据并且对数据进行了提交。事务A再次查询stu表数据,发现删除的数据又回来了,产生疑惑?是不是刚才执行失败了?

总结

l 脏读:读取到其他事务正在处理的未提交数据。

l 不可重复读:并发更新时,另一个事务前后查询相同数据时的数据不符合预期。

l 幻读:并发新增、删除这种会产生数量变化的操作时,另一个事务前后查询相同数据时的不符合预期。

对应的解决方案——事务的隔离级别

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE 是(Innodb除外)
SERIALIZABLE

隔离级别相关的SQL

l 获取当前事务隔离级别

SHOW VARIABLES LIKE 'transaction_isolation'; 

l 设置当前会话事务隔离级别为“读未提交”

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;![](https://img2020.cnblogs.com/blog/1176388/202109/1176388-20210904150039240-1210889672.png)
posted @ 2021-09-04 15:04  Richard·Lee  阅读(715)  评论(0)    收藏  举报