1.读未提交:
隔离级别最低。脏读,幻读,不可重复读都有可能发生。但性能高
2.读已提交:
它保证了事务不会出现中间状态的数据,所有数据都是已提交且更新的,解决了脏读的问题。但读已提交级别依旧很低,它允许事务间可并发修改数据,所以不保证再次读取时能得到同样的数据,也就是还会存在不可重复读、幻读的可能。
3.可重复读:
MySQL InnoDB 引擎的默认隔离级别,保证同一个事务中多次读取数据的一致性,解决脏读和不可重复读,幻读在本身隔离级别无法解决,通过next key lock和MVCC机制来解决.
4.可串行化
不会出现任何问题。 事务 A 操作数据库时,事务 B 只能排队等待,因此性能也最低。
脏读: 读到了未提交事务的数据。事务A对数据进行了修改,此时恰好事务B读取修改后了的数据,单数接着事务A发生了回滚,B读到了数据库以外的数据,就是脏读
不可重复读:事务 A 先读取一条数据,然后执行逻辑的过程中,事务 B 更新了这条数据,事务 A 再读取时,发现数据不匹配,这个现象就是“不可重复读”。
不可重复读的解决办法就是升级事务隔离级别,比如“可重复读”。
幻读:幻读指的是一个事务在进行一次查询之后发现某个记录不存在,然后会根据这个结果进行下一步操作,此时如果另一个事务成功插入了该记录,那么对于第一个事务而言,其进行下一步操作(比如插入该记录)的时候很可能会报错。从事务使用的角度来看,在检查一条记录不存在之后,其进行插入应该完全没问题的,但是这里却抛出主键冲突的异常。
eg: 简单来说:事务A的两次读之间有其他事务写操作,比如事务A统计年龄 > 30,当A两次读数据之间其他事务新添加了记录,所以事务A第二次读取到的数据突然多了一个,仿佛出现了幻觉一般,这就是一种幻读
使用 ID 做判断或做关键数据时,就会出现问题,这种现象就像是让事务 B 产生了幻觉一样,读取到了一个意想不到的数据,所以叫幻读。当然,不仅仅是新增,删除、修改数据也会发生类似的情况。
解决幻读不能使用可串行操作,那样数据库就失去了并发的功能