InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,但是不能解决幻读问题。
什么是幻读?
事务A读取了一个范围内的数据,此时事务B在该范围内插入了一条数据,并立马提交了事务,此时事务A再次读取这个范围的数据时,发现多了一条,就好像幻觉一样。
什么是MVCC?
多版本并发控制。InnoDB为每行记录添加了一个版本号(系统版本号),每当修改数据时,版本号加一。
在读取事务开始时&#xff0c;系统会给事务一个当前版本号&#xff0c;事务会读取版本号<&#61;当前版本号的数据&#xff0c;这时就算另一个事务插入一个数据&#xff0c;并立马提交&#xff0c;新插入这条数据的版本号会比读取事务的版本号高&#xff0c;因此读取事务读的数据还是不会变。
例如&#xff1a;
此时books表中有5条数据&#xff0c;版本号为1
事务A&#xff0c;系统版本号2&#xff1a;select * from books&#xff1b;因为1<&#61;2所以此时会读取5条数据。
事务B&#xff0c;系统版本号3&#xff1a;insert into books ...&#xff0c;插入一条数据&#xff0c;新插入的数据版本号为3&#xff0c;而其他的数据的版本号仍然是2&#xff0c;插入完成之后commit&#xff0c;事务结束。
事务A&#xff0c;系统版本号2&#xff1a;再次select * from books&#xff1b;只能读取<&#61;2的数据&#xff0c;事务B新插入的那条数据版本号为3&#xff0c;因此读不出来&#xff0c;解决了幻读的问题。