在MySQL的众多数据库存储引擎中,只有InnoDB支持事务,所有这里所说的事务隔离级别指的是InnoDB数据库存储引擎下的事务隔离级别。
mysql的事务隔离级别有以下四种:
1.读未提交:有两个事务,事务A和事务B,事务A中更新了一条数据记录且未提交,事务B可以读取到事务A未提交的数据更改。如果事务B使用了事务A未提交的更改数据,并在此基础上做了数据运算,并更改了数据库,如果事务A发生事务回滚,将会导致数据的不一致的情况出现。简单讲就是一个事务可以读取到另一个事务未提交的修改。这会带来脏读、幻读、不可重复读问题。
2.读已提交(oracle默认的隔离级别):这是很多数据库默认的事务隔离级别,但是不是mysql事务的默认隔离级别,这种隔离级别可以解决脏读的问题,但是无法解决可重复读以及幻读的问题。两个事务,事务A和事务B,事务A更新了某条数据记录并提交更改,事务B在事务A操作该数据之前读取一次数据,然后在事务A更新该数据并提交后再读一次,这样就读到的结果不一样(也称不可重复读)。简单讲就是一个事务只能读取另一个事务已经提交的修改。其避免了脏读,但仍然存在不可重复读和幻读的问题。
3.可重复读(mysql默认的隔离级别):两个事务,事务A和事务B,事务A更新了某条记录并提交,事务B在事务A操作该数据之前读取一次数据,然后在事务A更新该数据并提交后再读一次,读到的结果一样。简单讲就是同一个事务中多次读取相同的数据返回的结果是一样的。其避免了脏读和不可重复读问题,但幻读依然存在。
4.串行化:最高的事务隔离级别,在实际生产环境很少使用,因为这种隔离级别在应对高并发方面性能远远不足。串行化避免了脏读、不可重复读和幻读问题。
通用数据库的事务隔离级别如下图所示,请注意mysql在可重复读下幻读可能性的不同之处(不存在write操作的话就可以避免幻读)