面试被问:Mysql的InnoDB下RR是如何解决幻读问题的

这个问题应该分几方面来答
第一方面:什么是幻读

        Mysql事务在并发下会产生脏读、不可重复读、幻读问题。

赃读:一个事务可以读到另一个事务还没有提交的数据;

不可重复读:一个事务可以读到另一个事务修改并提交的数据;

幻读:一个事务两次相同的范围查找,之间另一个事务对这个范围insert了一条数据并提交,导致这两次事务查找的结果不一致。

第二方面:事务的隔离级别

读未提交:简称RU,可以读到其他事务还没有提交的数据。所以会有脏读、不可重复读、幻读问题。

读已提交:简称RC,解决了赃读的问题,但是还是有不可重复读、幻读问题。

可重复读:解决了不可重复读问题,当前读还解决了幻读问题。

串行化:事务串行执行,效率低。

第三方面:RR是如何解决的

        RR下的当前读(for update)会给范围查找的范围区间加上间隙锁或者临键锁,在这个区间加了间隙锁后就会阻塞其他事务对这个区间的数据插入,就解决了幻读问题

总结:

        RR解决幻读是通过当前读会加间隙锁,这样效率肯定会降低,如果我们的业务可以接受幻读和不可重复读的话,可以把隔离级别设置为RC,RC的当前读是不会加间隙锁的,RC只有记录锁,可以一定程度上提高我们程序的性能

你可能感兴趣的:(mysql,面试,面试,mysql,innodb,幻读,后端,java)