0%

MySQL的四种隔离级别

MySQL的四种隔离级别学习。

SQL标准定义了四类隔离级别,用来限定事务内外的哪些改变是可见的,哪些改变是不可见的。低的隔离级别一般支持更高的并发处理,拥有更低的系统开销。

四种隔离级别

  • Read Uncommitted,未提交读,所有事务可看到其他未提交事务的执行结果。读取未提交的数据,称为脏读Dirty Read。会导致脏读、不可重复读、幻读
  • Read Committed,提交读,一个事务只能看见已经提交事务所做的改变。会导致不可重复读,同一事务的其他实例在当前实例处理期间可能会有新的提交,可能导致同一select返回不同结果。会导致不可重复读、幻读
  • Repeatable Read,可重复读,可保证同一事务的多个实例在并发读数据时,会看到同样的数据。该级别只允许读取已提交记录,而且在一个事务两次读取一个记录期间,其他事务包含自己,不更新该记录。但是会导致幻读。当用户读取某一范围数据时,另外一个事务又在该范围内插入新行,当用户再读取该范围数据时,会发现有新的幻影行。会导致幻读。InnoDB使用MVCC解决幻读
  • Serializable,串行化,通过强制事务排序,解决幻读问题。在每个读的数据行上加上共享锁,可能会导致大量超时现象和锁竞争

脏读、不可重复读、幻读

  • 脏读,第一个事务已更新一份数据,另外一个事务在此时读取了这份数据,第一个事务回滚了更新,第二个事务目前读取到的数据就是不正确的
  • 不可重复读,同一个事务里,两次查询的结果不一致,可能是两次查询过程中插入了一个事务更新导致原有数据改变了
  • 幻读,在一个事务中,两次查询的数据数量不一致,第一个事务第一次查询了几行数据,另外一个事务此时插入了新的数据行,第一个事务再次查询会发现多了几行数据

参考

坚持原创技术分享,您的支持将鼓励我继续创作!
Fork me on GitHub