MySQL - 事务
SQL 标准定义了四个隔离级别
-
READ-UNCOMMITTED(读取未提交): 事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为脏读。
-
READ-COMMITTED(读取已提交): 事务读取已提交的数据,大多数数据库的默认隔离级别。当一个事务在执行过程中,数据被另外一个事务修改,造成本次事务前后读取的信息不一样,这种情况称为不可重复读。
-
REPEATABLE-READ(可重复读): 这个级别是MySQL的默认隔离级别,它解决了脏读的问题,同时也保证了同一个事务多次读取同样的记录是一致的,但这个级别还是会出现幻读的情况。幻读是指当一个事务A读取某一个范围的数据时,另一个事务B在这个范围插入行,A事务再次读取这个范围的数据时,会产生幻读
-
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
什么是脏读、幻读、不可重复读?
-
脏读:T1事务修改了A值(A‘),但是还没有commit。T2事务读取了A修改后的(A’)。
-
不可重复读:
-
场景描述:
-
T1事务在a时间查询A的值(A),但是未提交
-
T2事务在T1事务之后修改了A的值(A‘),并提交了
-
T1事务在b时间再次查询A的值,发现变成了A’
-
-
重点:是做update和del操作
-
扩展:InnoDB 通过使用 MVCC 来解决不可重复读的问题。在RR这种隔离级别下,当我们使用快照读进行数据读取的时候,只会在第一次读取的时候生成一个Read View,后续的所有快照读都是用的同一个快照,所以就不会发生不可重复读的问题了
-
-
幻读:
-
场景描述
-
T1事务在a时范围查询,未提交
-
T2事务insert 或 del数据**(重点是:插入或者删除,范围查询内,锁未覆盖)**
-
T1事务在b时范围查询,产生了幻读
-
-