概念
术语
脏写( Dirty Write ): 如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发了脏写
脏读( Dirty Read ) : 如果一个事务读到了另一个未提交事务修改过的数据,那就意味着发了脏读
不可重复读(Non-Repeatable Read): 如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那就意味着发了不可重复读
幻读(Phantom): 如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,那就意味着发了幻读
隔离级别
READ UNCOMMITTED :未提交读。
READ COMMITTED :已提交读。
REPEATABLE READ :可重复读。
SERIALIZABLE :可串行化。
对应隔离级别问题
READ UNCOMMITTED 隔离级别下,可能发生脏读
、不可重复读
和幻读
问题
READ COMMITTED 隔离级别下,可能发生不可重复读
和幻读
问题,但是不可以发生脏读
问题
REPEATABLE READ 隔离级别下,可能发生幻读
问题,但是不会发生脏读
和不可重复读
的问题
SERIALIZABLE 隔离级别下,各种问题都不可以发生。
MySQL
的默认隔离级别为REPEATABLE READ
MVCC(多版本并发控制)
在使用READ COMMITTD
、REPEATABLE READ
这两种隔离级别的事务在执行普通的SEELCT
操作时访问记录的版本链的过程,这样使可以使不同事务的读-写
、写-读
操作并发执行,从而提升系统性能
READCOMMITTD
、REPEATABLE READ
这两个隔离级别的一个很大不同就是:生成ReadView
的时机不同,READ COMMITTD
在每一次进行普通SELECT
操作前都会生成一个ReadView
,REPEATABLE READ
只在第一次进行普通SELECT
操作前生成一个ReadView
,之后的查询操作都重复使用这个ReadView
就好了