首先先来理解几个概念:
一、脏读
脏读是指事务A读取到了事务B更新了但是未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据,称之为脏读。
二、不可重复读
不可重复读指在数据库访问时,一个事务在前后两次相同的访问中却读取了不同的数据内容。
三、幻读
幻读是指事务A在查询完记录总数之后,事务B执行了新增数据的操作,事务A再次查询记录总数,发现两次查询的结果不一致,平白无故的多了几条记录,这种现象称为幻读。
MySQL中的四种隔离级别:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted(读未提交) | 是 | 是 | 是 |
Read committed(读已提交) | 否 | 是 | 是 |
Repeatable read(可重复读) | 否 | 否 | 是 |
Serializable(可串行化) | 否 | 否 | 否 |
一、Read uncommitted(读未提交):
在该级别中,所有的事务都可以看到其它未提交事务的执行结果,该隔离级别很少用于实际应用。读取未提交的数据,也称之为脏读。
二、Read committed(读已提交):
这是大多数数据库系统的默认隔离级别(但是不是MySQL默认的)。读已提交隔离级别就是在事务未提交之前所做的修改其他事物是不可见的。反过来说就是:一个事物只能看见已提交事务所做的改变。
三、Repeatable read(可重复读):
这是MySQL的默认隔离级别。保证同一事务中的多次相同的查询的结果是一致的。
四、Serializable(可串行化):
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简而言之:它是在每个读的数据行上加上共享锁,保证读取的范围内没有新的数据插入。但是在这个级别可能导致大量的超时现象和锁竞争。