事务的隔离级别
事务的隔离级别
-
READ UNCIMMITTED(未提交读)
事务中的修改,即使没有提交,其他事务也可以看得到,这种现象就叫做脏读,
例如:
A账户2000元,B账户0元,C账户0元
A给B转账 2000元
1、开启事务
2、查看 A 有没有 2000 元
3、有——A 减 2000元;无——回滚
4、B 加 2000元(停在这一步了)
5、提交事务
这是一个正常的事务
假如这个事务还没有提交,但是已经走到第三步了,这个时候又来了一个事务:B 给 C 转账 2000 元
B给C转账 2000元
1、开启事务
2、查看 B 有没有 2000 元 (可以查询到其他事务未提交的数据)
3、有——B 减 2000元;无——回滚
4、B 加 2000元
5、提交事务
总结:这就是事务还没提交,而别的事务可以看到他其中修改的数据的后果,也就是脏读。
-
READ COMMITTED(读已提交)
大多数数据库系统的默认隔离级别是READ COMMITTED(读已提交),这种隔离级别就是一个事务的开始,只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的。这种级别会出现读取 旧数据 的现象
重复读就是在事务内重复读取了别的线程已经提交的数据,但两次读取的结果不一致,原因是查询的过程中其他事物做了更新的操作。幻读是指在一个事务内两次查询中数据条数不一致,原因是查询的过程中,其他的事务做了添加操作。
总结:就是当一个事务执行到一半,而另一个事务看不到他执行的操作,所以看到的是旧数据,也就是无效的数据。
-
REPEATABLE READ(可重复读)
REPEATABLE READ是MySQL默认的事务隔离级别,它可以避免脏读,不可重复读的问题,确保同一事物的多个实例在并发读取数据时,会看到同样的数据行,但理论上,该级别会出现幻读的情况,不过MySQL的存储引擎通过多版本并发控制机制,解决了该问题,因此该级别是可以避免幻读的。
总结:虽然读取同一条数据可以保证一致性,也是可以避免幻读的。
-
SERIALIZABLE(可串行化)
SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况,由于他大量加上锁,导致大量的请求超时和锁竞争,因此性能会比较底下,再特别需要数据一致性且并发量不需要那么大的时候才可能考虑这个隔离级别。