图解MySQL脏读、幻读、不可重复读

脏读

脏读是指事务读取到了其它事务尚未提交的数据。

不可重复读

不可重复读是指并发更新时,另一个事务前后查询相同数据时数据不一致问题。

幻读

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


事务隔离级别

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

MySQL提供了4种隔离级别来解决以上问题,如图所示,从上至下隔离级别逐级变高,同时程序并发处理能力也就越来越低。

  • 读未提交(READ UNCOMMITTED):可以读取到其它事务尚未提交的数据,会产生脏读、不可重复读、幻读问题。
  • 读已提交(READ COMMITTED):只能读取到其它事务已提交的数据,不会产生脏读,但可能产生不可重复读、幻读。
  • 可重复读(REPEATABLE READ):MySQL默认的隔离级别,不会产生脏读、幻读问题,若存储引擎非innoDB的话则存在幻读可能性。
  • 可串行读(SERIALIZABLE):通过加入读锁方式,解决脏读、不可重复读、幻读问题,同时也就意味着效率大打折扣。

如何设置隔离级别

MySQL默认隔离级别为可重复读(REPEATABLE READ)

MySQL5.1后,默认存储引擎为InnoDB,因此默认也能解决幻读问题。

查看当前的隔离级别

show variables like 'transaction_isolation';

设置当前会话事务隔离级别为READ UNCOMMITTED(读未提交)

set session transaction isolation level READ UNCOMMITTED;
posted @ 2022-10-08 17:49  漆原Blog  阅读(529)  评论(0)    收藏  举报