MVCC机制
2022-09-05 22:22:30 27 举报
AI智能生成
MVCC(多版本并发控制)机制是一种用于解决数据库读写冲突的高级技术。它通过在每个数据行上保存多个版本,允许多个事务同时读取同一行数据,而不会产生锁或阻塞其他事务。当一个事务需要修改数据时,它会创建一个新的数据版本,而不是直接修改原始数据。这样,其他事务可以继续读取旧版本的数据,而不会被修改操作影响。MVCC机制还可以通过比较数据版本的差异来检测并合并事务的修改,从而避免了数据的不一致性。总之,MVCC机制提供了一种高效、灵活且无锁的数据库并发控制方法。
作者其他创作
大纲/内容
什么是MVCC
叫多版本并发控制
InnoDB记录老版本的信息,用以支持事务的特性。
应用场景有
回滚
使用旧版本信息构建回滚过程中所需的数据
并发一致性读
建立一行记录的早期版本信息实现一致性读取
回滚段:老版本的信息被一个称为回滚段的数据结构存储undo log表空间
undo log:旧版本信息被称为undo log
一个回滚段中有若干条undo log
版本链:若干条undo log链接在一起形成一条版本链
undo log表空间:表空间中有若干个回滚段
行记录的3个隐藏字段
DB_TRX_ID
插入或更新行记录的最新事务标识
DB_ROLL_PTR
回滚指针,指向回滚段中的一条undo log,即指向记录的上一个版本
DB_ROW_ID
行ID
如果没有主键,MySQL默认会使用一个隐藏字段rowid作为主键。这样就能生成主键索引了
为什么要有主键索引
因为插入数据的时候,要能够按照主键去排序,插入的过程就是慢慢生成了一个主键索引,这个索引就是B+Tree结构。方便我们查询数据
一致性读与锁定读
一致性读(快照读)
什么是快照读
同一时间有其他事务执行变更记录的操作,
一个读操作使用某个时间点的快照信息呈现查询结果
一个读操作使用某个时间点的快照信息呈现查询结果
如果被查询的数据被其他事务修改,InnoDB使用undo log重构成被更改前的内容
快照建立的时机
可重复读(RR)隔离级别
执行第一次读操作时建立
读已提交(RC)隔离级别
每一次一致性读操作建立
一致性读是InnoDB在读已提交和可重复读隔离级别下处理SELECT语句的默认模式
锁定读(当前读)
读取到的是最新版本的数据
为了保证其他并发事务不能修改当前记录,读取时会对记录进行加锁
SELECT... FOR UPDATE; UPDATE; INSERT; DELETE(排他锁,也叫X锁)这些操作都是当前读
ReadView
什么是ReadView
ReadView是InnoDB的一个内部快照,被用于MVCC机制
同时也有一个类叫做ReadView,里面有4个核心字段。
可见性算法:InnoDB将通过ReadView保存的信息判断事务可以看见哪个版本的行记录
ReadView类
4个重要的字段
m_creator_trx_id
创建当前一致性读的事务ID
m_ids
生成快照(ReadView)时,当前InnoDB中活跃的事务ID列表
m_low_limit_id
生成快照时,InnoDB将要给下一个事务分配的事务ID。
因为id是递增的,最新生成的id同时也是最小的,但它比已有的id都大
m_up_limit_id
生成快照时,活跃事务列表中最小的事务ID
MVCC原理
如何通过ReadView判断记录的哪个版本是否可见
对谁可见
ReadView是由事务触发的
大部分并发情况下,事务都会产生一致性读。那么就会产生快照
快照即是ReadView,ReadView即是快照
每条记录的版本链上哪个版本对谁可见?这个谁,是指事务,即哪个版本能被事务看到
核心判断条件
用记录的版本上的trx_id值与ReadVIew的m_creator_id、m_ids中的id值、m_low_limit_id、m_up_limit_id比大小
可见性算法
如果 trx_id = m_creator_trx_id,当前事务在访问它修改过的记录,可以被事务看见
如果 trx_id < m_up_limit_id,说明生成trx_id版本的事务已经在当前事务生成ReadView前提交了,所以该版本可以被当前 事务访问
如果 trx_id > m_low_limit_id,说明生成trx_id版本的事务在当前事务生成ReadView之后,该版本不可以被当前事务访问
如果 trx_id in m_ids,说明生成ReadView时,生成该版本的事务还处于活跃状态,不可以被当前事务访问
如果 trx_id not in m_ids,说明生成该版本的事务已经提交了,可以被当前事务访问
如果版本对当前事务不可见,则延着版本链找到下一个版本,重复上面的判断步骤,直到找到或到达版本链的最后一个版本为止
MVCC达到了什么效果
一致性读是InnoDB在可重复读、读已提交隔离级别下的默认模式
可重复读隔离级别
在可重复读隔离级别下,由于快照建立的时机是第一次读取操作时触发的,因此即使后面有多少个读取操作,根据可见性算法,都看不到别的事务提交的数据。这样就实现了可重复效果
读已提交隔离级别
在读已提交的隔离级别下,由于快照建立的时机是每一次读取操作触发的。因此,每一次读取操作都能看到别的事务提交的数据,这样就实现了读已提交的效果。
自由主题
0 条评论
下一页