MYSQL的事务隔离级别,MVCC,readView和版本链小结

[ readView实现事务隔离级别 ]以上两点都是基于隔离级别"读已提交"来进行说明的; 当mysql设置为"可重复读"时, 不同事务仍然是保存在版本链的不同节点上, 只不过新的事务创建的时候拷贝了当下的readView列表, 只要新事物不提交就一直使用这个拷贝的活跃列表; 假设此时100号数据提交了, 我在新事务执行...
MYSQL的事务隔离级别,MVCC,readView和版本链小结
MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。这种并发控制的方法,主要应用在RC和RR隔离级别的事务当中,利用执行select操作时,访问记录版本链,使得不同事物的读写,写读可以并发执行,提高系统性能。
Innodb 有两个隐藏字段 trx_id(事务id)和roll_pointer(回滚指针)。 transaction id : innoDB里面每个事务有一个唯一的事务ID,叫作transaction id,它是在事务开始的时候向InnoDB的事务系统申请的,是按申请顺序严格递增的。 roll_pointer : 指向上一事务版本的指针。 版本链 : 是一个单链表结构,对于同一行数据,每一个事务对其进行更新的时候都会产生一个新的版本,就会存储在这个链表当中。

一个存储事务id的列表。
readview的几个参数: m_ids:表示活跃事务id列表 min_trx_id:活跃事务中的最小事务id max_trx_id:已创建的最大事务id creator_trx_id:当前的事务id。 readview的生成时机: RC隔离级别:每次读取数据前,都生成一个readview; RR隔离级别:在第一次读取数据前,生成一个readview;
使用场景: [ 创建事务节点 ] 当我创建一个新的事务需要读取一行数据, 我会查询活跃的事务列表; 假设我当前的事务id是200, 当前活跃的事务id没有我的200, 因此需要去拷贝一个最新的不活跃事务并在版本链最后插入一个新节点200; mysql会去对比版本链和readView, 假设版本链数据为[1,50,100,150], 活跃列表为[100,150], 说明100和150都是未提交的活跃事务, 再向前一个节点50不在活跃事务列表说明事务50已经提交, 所以事务200拷贝事务50并插入版本链最后, 且将200追加到readView活跃列表的最后一个元素
[ 使用事务节点 ] 当我再次进行200号事务的查询或修改, 我需要读版本链的数据, 因为上一次操作已经在版本链做了200号节点, 因此我读的数据都是200号节点的数据, 这样就隔离了其他未提交的事务; 我的全部增删查改都在200号版本链上进行
[ readView实现事务隔离级别 ]以上两点都是基于隔离级别"读已提交"来进行说明的; 当mysql设置为"可重复读"时, 不同事务仍然是保存在版本链的不同节点上, 只不过新的事务创建的时候拷贝了当下的readView列表, 只要新事物不提交就一直使用这个拷贝的活跃列表; 假设此时100号数据提交了, 我在新事务执行了select 会去查活跃列表发现100号事务还是未提交状态, 因此读取到的还是50号事务提交的记录。
原子性,一致性,隔离性,持久性。
未提交读(read uncommitted)、提交读(read committed)、可重复读(repeatable read)、序列化读(serializable)
2022-07-16
mengvlog 阅读 182 次 更新于 2025-09-09 16:37:03 我来答关注问题0
  •  翡希信息咨询 MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

    MySQL锁、事务隔离级别、MVCC机制、间隙锁、死锁详解MySQL锁: 分类: 乐观锁:通过比较数据的版本号来避免冲突。 悲观锁:在修改数据前加锁,防止其他事务修改。 读锁:允许多个读操作同时进行。 写锁:阻断其他写锁和读锁。 表锁:锁住整张表。 行锁:锁住一行数据。事务隔离级别...

  •  文暄生活科普 什么是事务的隔离级别?MySQL的默认隔离级别是什 么?

    事务的隔离级别是指数据库系统为事务处理所定义的隔离界别,这些界别规定了事务之间的相互影响程度,以此来达到不同的数据一致性和并发性能要求。SQL 标准定义了四个隔离级别,由低到高依次为:Read uncommitted、Read committed、Repeatable read、Serializable。READ-UNCOMMITTED(读取未提交):最低的隔离级别...

  •  深空见闻 mysql事务隔离级别

    可重复读保证同一事务内多次读取同一数据结果一致,不受其他事务修改影响,可避免脏读、不可重复读。不过可能出现幻读,即同一事务内两次范围查询,因其他事务插入或删除数据导致行数变化。这是MySQL的默认隔离级别,InnoDB通过MVCC和间隙锁解决幻读。可串行化是最高隔离级别,强制事务串行执行,完全避免并发...

  •  翡希信息咨询 MySQL事务的隔离级别:脏读、不可重复读和幻读详解

    MySQL事务的隔离级别:脏读、不可重复读和幻读详解脏读(Dirty Read)定义:如果一个事务读取到了另一个未提交事务修改过的数据,那就意味着发生了脏读。解释:脏读是指一个事务能够读取到另一个事务尚未提交的数据。这种情况可能会导致数据的不一致性,因为未提交的数据可能会回滚,从而导致读取到的...

  • MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。这种并发控制的方法,主要应用在RC和RR隔离级别的事务当中,利用执行select操作时,访问记录版本链,使得不同事物的读写,写读可以并发执行,提高系统性能。Innodb 有两个隐藏字段 trx_id(事务id)和roll_pointer(回滚指针)。 transaction id...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部