底层机制Mvcc

隔离级别实现原理(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快照读.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值