底层机制Mvcc

MVCC是MySQL InnoDB存储引擎为提高并发性能而采用的多版本并发控制技术。它通过行的隐藏列DB_TRX_ID和DB_ROLL_PTR配合Undo log实现不同事务的并发读写。ReadView是事务开始时记录的活跃事务集合,用于确定事务可见的记录版本。根据不同的隔离级别,如READ COMMITTED和REPETABLE READ,MVCC有不同的判断规则来决定事务能否访问某个版本的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

隔离级别实现原理(MVCC)

MVCC(多版本并发控制Multi-Version Concurrent Control)是MySql提高性能的一种方式,配合Undo log和版本链,让不同的事物的读-写,写-丢操作可以并发执行,从而提升系统性能.

MVCC使得数据库读不会对数据加锁,普通的SELECT请求不会加锁,提高了数据的并发处理能力.借助MVCC,数据库可以实现(读已提交)READ COMMITTED,(可重复读)REPETABLE READ等隔离级别.

InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的,一个保存了行的事物Id(DB_TRX_ID),一个保存了行的回滚指针(DB_ROLL_PT).

db_trx_id:每次对某条聚簇索引记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列.

db_roll_pt:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo log 日志中,然后这个隐藏列相当于一个指针,可以通过它来找到该记录修改前的信息.

ReadView

Read View是事务开启时,当前所有事务的一个集合,这个数据结构中存储了当前Read View中最大的ID及最小的ID

对于使用READ UNCOMMITTED(读未提交)隔离级别的事务来说,直接读取最新版本就好,对于使用SERIALIZABLE(串行化)隔离级别的事务来说,使用加锁的方式来访问记录.

对于使用READ COMMITTED(读已提交)和REPETABLE READ(可重复读),就需要用到版本链,核心问题:需要判断一个版本链中的那个版本是当前事务可见的.

ReadView:主要包含当前系统中还有那些活跃的读写事务,把他们的事务id放到一个表中.

m_ids:表示在生成ReadView时当前系统中活跃的读写事务id列表.

min_trx_id:生成ReadView时当前系统中活跃的读写事务中最小的事物id,也就是m_ids中的最小值.

max_trx_id:生成ReadView时系统中应该分配给下一个事务的id,并不是活跃列表m_ids中的最大值.

creator_trx_id:生成该ReadView的事物的事务id;

当前版本事务id,当前ReadView的create_trx_id(cid).

若id=cid,表示当前事务自己修改的,可以被访问,直接返回此版本.

若id<cid,表示是当前事务之前的事务提交的修改,可以被访问.

若id>ReadView的mix_trx_id,表示在当事务之后又开启了事务修改产生的版本,不可以被访问,继续沿着版本链向后访问.

若此版本的事务id在当前ReadView的min_trx_id和max_trx_id之间就需要判断,修改了此版本的事务id是否是活跃的,即在m_ids列表内,则说明此版本的事务此时还没提交,则此版本不能被访问.若没有活跃,说明是已经提交的事务修改的,则可以被访问.

若此记录的版本链访问完,都不可访问,查询结果就没有这条记录.

READ COMMITTED--每次读取数据前都生成一个ReadView.当前读

REPEATBLE READ--在第一次读取数据时生成一个ReadView快照读.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值