概念
术语
- 脏写( 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
就好了