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

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

不可重复读是指在同一次事务中前后查询不一致的问题。
上述案例:事务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;

浙公网安备 33010602011771号