wap网站分享到微信,正规网站建设官网,wordpress文章阅读量,廊坊百度网站排名在MySQL中#xff0c;MVCC是一种用于提供并发控制的技术#xff0c;它允许数据库系统在事务并发执行的情况下保持数据的一致性#xff0c;同时提高了数据库的并发性能。MVCC背后的理念是允许每个事务可以看到一个一致性的快照#xff0c;从而避免了读取操作被写入操作所阻塞…在MySQL中MVCC是一种用于提供并发控制的技术它允许数据库系统在事务并发执行的情况下保持数据的一致性同时提高了数据库的并发性能。MVCC背后的理念是允许每个事务可以看到一个一致性的快照从而避免了读取操作被写入操作所阻塞的情况。不用加锁解决多并发场景下的快照读问题
1 MVCC的原理
MVCC的核心思想是为每个数据行保存其在不同时间点的版本并通过版本号或时间戳来标识这些版本。当一个事务开始时MySQL会为该事务创建一个独立的事务ID并利用这个ID去获取数据的一致性快照。
Undo日志在MySQL中MVCC的实现依赖于undo日志也称为回滚日志。当某个事务对数据进行修改时MySQL不会立即覆盖原始数据而是将修改前的原始数据保存到undo日志中。这样其他事务仍然可以访问到这个数据的旧版本从而实现了数据的多版本管理。ReadView每个事务在启动时都会创建一个ReadView这个视图通过检查undo日志中的信息和事务的时间戳来确定哪些数据版本对于当前事务是可见的。这样对于已提交的数据版本ReadView会返回最新的版本对于未提交的数据版本ReadView则会返回旧的版本或者忽略这些数据。
2 当前读和快照读
2.1 当前读
查询当前已提交最新的数据
SELECT LOCK IN SHARE MODE;共享锁SELECT FOR UPDATE;排它锁UPDATE排它锁DELETE排它锁INSERT排它锁串行化事务隔离级别
2.2 快照读
普通的select查询通过MVCC进行版本链查找就叫快照读
3 版本链
3.1 什么是版本链
首先聚簇索引的叶子节点存储数据包括两个隐藏字段trx_id(事务ID)、roll_pointer(回滚指针)
trx_id(事务ID)记录的是修改当前这行数据的事务IDroll_pointer(回滚指针)记录该行数据上个版本的地址
因此版本链其实就是由回滚指针roll_pointer串起来的该行数据对应的各个版本。
3.2 read view
MySQL中的Read View读视图是多版本并发控制MVCC机制的一部分。在多用户并发访问数据库时read view 能够确保每个用户看到的数据都是一致的避免了脏读、不可重复读等问题。
read view中四个核心参数
m_ids当前活跃事务ID列表min_trx_id活跃事务最小IDmax_trx_id下一个事务IDcreator_trx_id当前事务ID 如何判断版本链中可用版本
4 MVCC在读已提交和可重复读下区别
根本原因在于RC隔离级别下事务中每次select都会创建一个read view而RR隔离级别只会在事务中创建一次read view
4.1 读已提交场景
简单理解读取已提交最新的数据能解决脏读有不可重复度问题。
根本原因读已提交事务隔离级别下事务里面每次select查询都会创建一个read view。
举例说明事务A 进行一次修改事务B进行两次查询
首先开启A事务并修改为‘北冥-2’事务未提交。修改前查询最新数据时会生成read view然后开启事务B进行select查询此时查询到的数据为‘北冥’read view 如下事务A提交事务。数据被提交到磁盘。事务B再次相同select查询read view如下此时min_trx_id变成了2当判断trx_id min_trx_id满足条件所以获取到最新数据和之前数据不一致。因此不可重复度。 4.2 可重复读场景
简单理解读取已提交最新的数据能解决脏读有不可重复度问题。
根本原因可重复读事务隔离级别下每个事务只会创建一个read view同一个事务里面的select操作共用同一个read view。
举例说明事务A 进行一次修改事务B进行两次查询
首先开启A事务并修改为‘北冥-2’事务未提交。修改前查询最新数据时会生成read view然后开启事务B进行select查询此时生成read view根据版本链查询到的数据为‘北冥’ 3. 即便后面事务A已经提交了事务最新数据被更改为了‘北冥-2’但是事务B的read view 还是之前那个在根据上面条件进行判断时最新数据中trx_id2不符合根据回滚指针找到下一条数据trx_id1才符合因此读到的数据跟第一次是一样的。
mysql解决了幻读吗 只解决了快照读下的幻读而当前读需要通过间隙锁
RC隔离级别下有间隙锁吗 没有
参考 B站 IT老哥 阿里P7要求这么低吗老哥给你讲清楚什么是MySQL的MVCC