Mysql中的innoDB怎么解决幻读

1.Mysql的事务隔离级别

这四种隔离级别,当存在多个事务并发冲突的时候,可能会出现脏读,不可重复读,幻读的一些问题,而innoDB在可重复读隔离级别模式下解决了幻读的一个问题,

2. 什么是幻读

幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致

InnoDB如何解决数据库的幻读问题

如图,第一个事务里面,我们执行一个范围查询,这个时候满足条件的数据只有一条,而在第二个事务里面,它插入一行数据并且进行了提交,接着第一个事务再去查询的时候,得到的结果比第一次查询的结果多出来一条数据,注意第一个事务的第一次和第二次查询,都在同一个事物里面,所以,幻读会带来数据一致性的问题

3. InnoDB如何解决幻读的问题

InnoDB引入间隙锁和next-key lock机制去解决幻读问题

假如现在存在这样一个B+Tree的索引结构,这个结构有4个索引元素,分别是1,4,7,10 当我们通过主键索引查询一条记录,并且对这条记录通过for update加锁的时候

这个时候会产生一个记录锁,也就是行锁,锁定id=1这个索引

被锁定的记录在锁释放之前,其他事务无法对这一条记录做任何操作的,前面我们所过对幻读的定义,幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致,注意这里敲掉的是范围查询,也就是说要解决幻读的问题,必须保证一个点

就是如果一个事务通过这样一条语句进行锁定的时候,另外一个事务再执行

这样一条insert语句需要被阻塞,直到前面获得所的事务被释放,所以在innonDB设计一种间隙锁,它的主要功能是锁定一定范围内的索引记录

当对查询范围id >
4 and id <
7这个范围加锁的时候,会针对B+数中(4,7)这个开区间的范围加间隙锁,意味着在这种情况下其他事务对这个区间的数据进行插入更新删除都会被锁住,但是还有另外一种情况,比如像这样

这条查询语句针对id >
4这个条件加锁,那么它需要锁定多个索引区间,所以这个情况下InnoDB引入一个叫next-key lock机制,next-key lock相当于间隙锁和记录锁的合集,记录锁锁定存在记录的行,间隙锁锁住的是记录行之间的间隙,而next-key lock锁住的是两者的和

每个数据行非唯一的索引列,都会存在一把next-key lock,当某个事务持有这一行数据的next-key lock的时候,会锁住一段在左开右闭区间的数据,因此当通过id >
4这样一个范围加锁的时候,InnoDB会去加一个next-key lock锁,锁定的区间范围是(4,7 ](7,10 ](10,+♾️ ]。间隙锁和next-key lock的区别是在加锁的范围,间隙锁锁定的是两个索引之间的间隙,而next-key lock会锁定多个索引区间,它包含记录锁和间隙锁当我们使用范围查询不仅仅命中Record记录,还包含了Gap间隙的时候,在这种情况下使用的就是临键锁,也就是next-key lock它是Mysql里面默认的行锁算法



数据库幻读问题一直是开发人员的头痛之一。幻读问题通常发生在并发情况下,当一个事务在查询一个范围内的行时,另一个事务在该范围内插入或删除行,导致前一个事务再次查询时出现了“幻现象”——新插入的行或删除的行出现在结果集中。在MySQL中,通过InnoDB存储引擎可以解决幻读问题。
一、什么是InnoDB存储引擎?
InnoDB是MySQL数据库的默认存储引擎,它是一个支持事务的关系型数据库引擎。与其他存储引擎相比,InnoDB具有更高的并发性、可靠性和事务性。
二、什么是幻读?
幻读是指同一个事务在不同的时间点执行相同的查询语句,但结果集却不同。常见的幻读问题包括区间插入、区间删除等。
三、InnoDB的锁机制
InnoDB通过锁机制来防止幻读问题的出现。InnoDB支持两种锁:共享锁和排它锁。共享锁即多个事务可以同时持有该锁,适用于读操作。排它锁只能被一个事务持有,适用于写操作。
四、InnoDB的MVCC机制
InnoDB通过MVCC(多版本并发控制)机制来优化并发,避免幻读问题。MVCC是指在数据库中创建多个版本的行记录,每个版本有不同的时间戳,随着时间的推移,旧版本的行记录将被删除,新版本的行记录将会生成。
五、InnoDB的事务隔离级别
InnoDB支持四种事务隔离级别:读未提交、读已提交、可重复读和串行化。其中,可重复读级别是最适合防止幻读问题的。在可重复读隔离级别下,MySQL使用MVCC机制来生成不同版本的记录来解决幻读问题。
六、InnoDB的锁粒度
InnoDB锁粒度的大小将直接影响性能和锁的争用。InnoDB的锁粒度分为表锁和行锁。表锁是指锁定整张表,行锁是指锁定行。
七、如何避免幻读问题?
除了使用InnoDB的MVCC、锁机制和事务隔离级别来解决幻读问题外,还可以通过优化并发控制来避免幻读问题的出现,例如减少更新并发事务频率,避免靠近查询的更新操作、避免使用外键约束等。
总结:
在高并发的应用场景下,如何解决数据库的幻读问题是至关重要的。通过使用InnoDB存储引擎、MVCC机制、事务隔离级别和锁机制,可以有效地解决幻读问题,并提高数据库的性能和可靠性。