并发事务问题、隔离级别
并发事务问题、隔离级别
并发事务的问题:脏读、不可重复读、幻读
-
脏读:一个事务读到了另一个事务还没有提交的数据,就是脏读。如下图,事务A进行了一次查询之后再进行了修改数据的操作,这时候事务B去查询了数据,但是事务A的修改操作还没有提交,事务B就读到了修改之后的新的数据。这就是脏读。
-
不可重复读:一个事务先后读取同一条数据,但是两次读取的数据不一致,就是不可重复读。如下图,事务A先进行了一次读取,之后事务B就进行了修改并且提交了数据,事务A在这之后又查询了数据,但是这两次的数据不一致,就是不可重复读。
-
幻读:一个事务按照条件查询数据的时候,没有对应的数据行,但是在插入数据的时候发现这个数据已经存在了,这就是幻读。如下图,当事务A去查询数据的时候发现不存在,当事务A要插入数据的时候事务B就先插入了数据并提交了事务,那么事务A就插入不进去数据,随后事务A去查询的时候,获取的依旧是空的数据。前提是已经解决了不可重复读的问题,否则第二次读取就能读取到数据。
这些问题可以通过:对事务进行隔离解决。
隔离级别:读未提交、读已提交、可重复读、串行化
- 未提交读(RU):不能解决并发事务的问题,一般我们也不使用这个级别。
- 读已提交(RC):只能解决脏读的问题。
- 可重复读(RR):解决了脏读和不可重复读的问题,但是会出现幻读的问题。MySQL默认的就是可重复读。
- 串行化:解决了并发事务的三个问题,但是效率是比较低的。(一个事务提交之后,其他的事务才能运行),因为这个效率极低所以一般不会去使用的。
并发事务带来那些问题呢?如何解决?MySQL的默认隔离级别是?
- 事务带来的问题是 脏读、不可重复读、幻读。
- 通过事务隔离级别可以解决。分别有 未提交读(它不能解决并发事务的任何问题)、读已提交(它解决了脏读的问题)、可重复读(它解决了脏读和不可重复读的问题)、串行化(它解决了脏读、不可重复读、幻读的问题但是性能很低)。
- MySQL默认的隔离级别是可重复读的级别。
为什么MySQL默认使用RR隔离级别?
MySQL默认使用RR是基于历史和技术考虑的,可重复读隔离级别,在更新数据时会增加记录锁和间隙锁,可以避免事务乱序导致的数据不一致的问题。