Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
存在的问题:脏读、不可重复读、幻读
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
存在的问题:不可重复读、幻读
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
存在的问题:幻读
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
脏读:
读取未提交的数据
不可重复读(Nonrepeatable Read):
同一事务的多个select可能返回不同结果。
A事务 第一次select,B事务update(insert delete),然后commit,A事务第二次select,此时结果和第一次不同
幻读 (Phantom Read):
幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
A事务 第一次select,发现自增主键最大为10,B事务insert一条数据,然后commit,A事务insert主键为11的一条数据,此时会报主键冲突。