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 阅读 7 次 更新于 2025-07-21 03:50:25 我来答关注问题0
  •  翡希信息咨询 MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

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

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

    MySQL事务的隔离级别:脏读、不可重复读和幻读详解脏读(Dirty Read)定义:如果一个事务读取到了另一个未提交事务修改过的数据,就意味着发生了脏读。脏读允许一个事务读取到另一个事务尚未提交的数据,这可能会导致数据的不一致性。例如,事务A正在修改某条记录,但尚未提交,此时事务B读取了这条记...

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

  •  翡希信息咨询 MYSQL事务的四种隔离级别

    MYSQL事务的四种隔离级别:读未提交(Read Uncommitted)定义:允许一个事务读取另一个未提交事务的数据。特点:此隔离级别可能会导致脏读(Dirty Read),即一个事务可以读取到另一个事务尚未提交的数据。这可能导致数据不一致的问题。示例:在事务A中,对Alice的值进行了更新但尚未提交,此时事务B读取...

  •  文暄生活科普 五分钟了解Mysql脏读、幻读、不可重复读、mvcc

    理解Mysql事务隔离级别与并发控制 数据库并发操作中,多事务并发执行会引发问题,如脏读、脏写、不可重复读、幻读。这通常与事务的并发隔离级别有关。脏读、脏写:一个事务更新数据后,另一个事务读取了其未提交的数据,导致数据不一致。不可重复读:事务多次读取同一数据时,结果不一致,因另一个事务...

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

mySQL相关话题

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