mysql为什么是部分解决幻读

先看一下事务并发中两个容易混淆的概念:
不可重复读 和 幻读

不可重复读:事务A重复读取同一条数据,在读取的同时事务B修改并提交了这个条数据,那么A再读取的时候就会发生不一致。

mysql中默认的隔离级别是可重复读
如何解决呢:
1:当前读:给改条数据加锁(悲观锁),即读取的时候就加锁,防止其他事务读取该数据().它能保证读取的都是最新数据
2:快照读:mvcc,多版本并发控制,详细的原理就不说了,它使得读写不冲突,由于读的都是事务的当前版本的数据,因此重复读也不会发现数据被修改

在mysql种这两种方式的体现就是加锁和不加锁
普通查询不加锁使用快照读
如果在事务中出了查询外还有其他增加修改操作那么久要手动加锁实现当前读

是否mvcc就解决了幻读呢?一定程度上可以这么说,因为它保证事务中多次读取不会产生新的记录。
但是我们如果在事务中进行了插入操作,是否就能保证这条记录在插入时不存在呢?这点是不能保证的,这也是快照读的弊端。因此如果我们要保证操作安全就要手动加锁,如
select name from student where id >= 0 for update…

或者使用串行化的隔离级别

这是我对mysql幻读的理解,如果理解存在问题欢迎指出。

MySQL的可重复读级别是解决部分幻读的问题,但并没有完全解决幻读是指在一个事务中,当某个范围内的记录被其他事务插入或者删除时,当前事务再次读取该范围的记录时,会出现不一致的现象。 在MySQL的可重复读级别下,使用了行级锁来保证事务的隔离性,防止并发事务之间相互干扰。具体而言,可重复读级别使用了next-key锁,将索引的范围加上了锁,防止其他事务对该范围内的记录进行插入或者删除操作。这样可以确保在一个事务中多次读取同一范围的记录时,结果始终相同,避免了读取到其他事务插入或删除的幻影行。 然而,可重复读级别并不能完全解决幻读问题。因为它只能保证在同一个事务内,对同一范围的查询结果是一致的,但无法防止其他事务在当前事务查询过程中插入新的记录或者删除现有的记录,从而导致幻读。也就是说,对于已经存在的记录,可重复读级别可以保证读取的结果是一致的,但对于新插入的记录,则无法预测是否会被查询到。 为了解决幻读问题,MySQL引入了更高的隔离级别,如串行化。在串行化级别下,对于同一范围的查询结果,在事务开始和提交之间都会加上行级锁,防止其他事务对该范围内的记录进行插入或者删除操作,从而完全解决幻读问题。但需要注意的是,在串行化级别下,可能会导致并发性能下降,因为所有的事务都需要按照先后顺序依次执行,无法并发进行。 综上所述,MySQL的可重复读级别可以解决部分幻读问题,但无法完全解决。为了彻底解决幻读问题,需要使用更高的隔离级别,如串行化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值