- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
InnoDB 的 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是 MySQL 实现高并发事务处理的一种机制。通过 MVCC,InnoDB 可以在高并发环境下支持 事务隔离,并提供 非阻塞的读操作,从而避免锁定所有读操作带来的性能瓶颈。MVCC 允许事务在不加锁的情况下读取数据,保证了性能和一致性.
MVCC 的核心思想是 通过保存数据的多个版本 来支持并发读写。每个事务在读取数据时看到的是某个数据的特定版本,而不是当前最新的值。这个机制依赖于 Undo Log,通过保存每一行记录的历史版本来支持多版本读取。(undolog) 。
trx_id
),InnoDB 使用事务 ID 来区分数据的不同版本。SELECT * FROM table WHERE id = 1;
,执行的是不加锁的快照读操作。SELECT * FROM table WHERE id = 1 FOR UPDATE;
,执行的是加锁的当前读操作。InnoDB 通过 行版本控制 来管理数据的不同版本。每一行数据在 InnoDB 的行记录中都包含两个隐藏的字段:
trx_id
。Read Committed
或 Repeatable Read
)。当一个事务修改数据时,InnoDB 会将当前数据的旧版本保存到 Undo Log 中,并在数据行中更新最新的 trx_id 和 roll_pointer。这样即使数据被更新,其他未提交的事务依然可以通过 Undo Log 访问到旧版本的数据.
每行数据都会有多个历史版本,并通过 roll_pointer 链接到这些历史版本.
版本链是基于 trx_id 和 roll_pointer 建立的,即每次修改数据时,会在 Undo Log 中存储旧版本,行记录会指向旧版本。版本链的结构如下:
最新记录 <-- trx_id_x --trx_id_y --trx_id_z... --> 历史版本
当事务读取数据时,会根据事务的隔离级别、当前事务的 trx_id 以及数据的 trx_id 来决定应该读取哪个版本.
InnoDB 的 MVCC 机制在不同的事务隔离级别下有不同的行为表现:
InnoDB 使用事务 ID(trx_id)来区分不同事务对数据的修改。每次修改都会将当前事务的事务 ID 记录在该行数据的 trx_id 字段中。通过事务 ID,InnoDB 可以判断当前事务是否能够看到某一行数据的特定版本.
一致性视图(Consistent Read View)是指当前事务只能看到事务启动时的数据快照,除非事务使用的是当前读。InnoDB 会根据当前事务的事务 ID 和一致性视图来确定读取哪一个版本的数据.
当一个事务修改数据时,InnoDB 会将原始的数据版本存入 Undo Log 中,Undo Log 中记录了数据的历史版本。通过 roll_pointer,InnoDB 可以在发生并发时,允许其他事务读取数据的旧版本.
在电商系统中,用户在事务 A 中查询订单时,订单数据可能会被其他事务修改或插入新记录。通过 MVCC,事务 A 查询时看到的订单数据是一致的,即便其他事务插入了新的订单,事务 A 依然能看到一个稳定的订单视图.
在金融系统中,用户账户余额的查询需要确保每次查询得到的结果一致,即使账户余额在后台因某些事务而发生变化,用户也能看到一贯的账户信息,保证用户体验的一致性。MVCC 在这种场景下能保证高并发下的数据一致性.
最后此篇关于一文彻底弄懂MySQL的MVCC多版本控制器的文章就讲到这里了,如果你想了解更多关于一文彻底弄懂MySQL的MVCC多版本控制器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!