MySQL事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL事务隔离级别总共有以下4种:
READUNCOMMITTED:读未提交。
READCOMMITTED:读已提交。
REPEATABLEREAD:可重复读。
SERIALIZABLE:序列化。
1.四种事务隔离级别1.1READUNCOMMITTED读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。
1.2READCOMMITTED读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同SQL查询中,可能会得到不同的结果,这种现象叫做不可重复读。1.3REPEATABLEREAD可重复读,MySQL默认的事务隔离级别。可重复读可以解决“不可重复读”的问题,但还存在幻读的问题。所谓的幻读指的是,在同一事务的不同时间使用相同SQL查询时,会产生不同的结果。例如,一个SELECT被执行了两次,但是第二次返回了第一次没有返回的一行,那么这一行就是一个“幻像”行。
注意:幻读和不可重复读的侧重点是不同的,不可重复读侧重于数据修改,两次读取到的同一行数据不一样;而幻读侧重于添加或删除,两次查询返回的数据行数不同。1.4SERIALIZABLE序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。
1.5小结简单总结一下,MySQL中的事务隔离级别就是为了解决脏读、不可重复读和幻读等问题的,这4种隔离级别与这3个问题之间的对应关系如下:
2.并发事务中的问题并发事务中存在以下3个问题。
2.1脏读一个事务读取到了另一个事务为提交保存的数据,之后此事务进行了回滚操作,从而导致第一个事务读取了一个不存在的脏数据。
2.2不可重复读在同一个事务中,同一个查询在不同的时间得到了不同的结果。例如事务在T1读取到了某一行数据,在T2时间重新读取这一行时候,这一行的数据已经发生修改,所以再次读取时得到了一个和T1查询时不同的结果。
2.3幻读MySQL对幻读的定义如下:
Theso-calledphantomproblemoccurswithinatransactionwhenthesamequeryproducesdifferentsetsofrowsatdifferenttimes.Forexample,ifaSELECTisexecutedtwice,butreturnsarowthesecondtimethatwasnotreturnedthefirsttime,therowisa“phantom”row.官方文档: