MySQL57的innodb下MVCC是如何运行的如何解决的幻读
在MySQL 5.7中,InnoDB存储引擎使用多版本并发控制(MVCC)来处理并发事务。
MVCC通过为每个事务分配唯一的事务ID(Transaction ID)来实现。每行数据都包含一个隐藏的版本号,用于跟踪事务对数据的修改。
当一个事务开始时,它会使用当前的事务ID作为自己的事务ID,并且该事务ID会递增。当事务修改一行数据时,它会将该行数据的旧版本保存在Undo日志中,并将新版本的数据写入到数据页中。其他事务仍然可以访问该行数据的旧版本。当事务提交时,它会将修改后的数据的版本号更新为当前的事务ID。
MVCC能够解决幻读问题,幻读是指在一个事务中,查询同一个表两次,第一次查询得到一些行,然后在第二次查询中,由于其他事务插入了新的行,所以得到了不同的行。
为了解决幻读问题,InnoDB使用了Next-Key Locks。Next-Key Lock是一个组合锁,它在行级别上锁,并且还会锁住索引范围,以防止其他事务在范围内插入新的行。
当一个事务执行SELECT语句时,InnoDB会根据WHERE条件获取需要的行,并对这些行的Next-Key Lock进行加锁,以防止其他事务插入新的行。这样可以确保在同一个事务中执行多次相同的SELECT语句时,结果是一致的。
总结来说,MVCC通过为每个事务分配唯一的事务ID和使用Next-Key Locks来实现并发控制和解决幻读问题
原文地址: http://www.cveoy.top/t/topic/iNqM 著作权归作者所有。请勿转载和采集!