事务隔离级别解决的现象:
脏读
指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了最终不一定存在的数据,这就是脏读。
不可重复读
指的在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受其他事务的影响,如其他事务改了这批数据并提交了导致其他事务最新时刻读到新数据。通常针对数据更新(UPDATE)操作,针对同一数据的某字段。
幻读
幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。多次读取一个范围内的记录(包括直接查询所有记录结果或者做聚合统计), 发现结果不一致(标准档案一般指记录增多, 记录的减少应该也算是幻读)。
隔离级别结论
读未提交:即读到其他事务未提交的数据,造成脏读
读提交:即数据在事务开始结束时读到的数据都是一致的,不管其他事务是否提交
可重复读:保证本事务全程数据一致,避免不可重复读的情况,是在读提交基础上的进一步限制
串行化:事务是串行执行的,因此读的数据必然可靠,但是性能最差
总结
MySQL 的 InnoDB 引擎才支持事务,其中可重复读是默认的隔离级别。事务隔离对应在事务过程中的上锁方式,从上到下性能越差
读未提交和串行化基本上是不需要考虑的隔离级别,前者不加锁限制,后者相当于单线程执行,效率太差。
读提交解决了脏读问题,行锁解决了并发更新的问题。并且 MySQL 在可重复读级别解决了幻读问题,是通过行锁和间隙锁的组合 Next-Key 锁实现的。
Postgresql中只有读提交、可重复读、串行化,默认为读提交