【数据库】聊聊MVCC机制与BufferPool缓存机制

这篇具有很好参考价值的文章主要介绍了【数据库】聊聊MVCC机制与BufferPool缓存机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇文章,介绍了隔离级别,MySQL默认是使用可重复读,但是在可重复读的级别下,可能会出现幻读,也就是读取到另一个session添加的数据,那么除了配合使用间隙锁的方式,还使用了MVCC机制解决,保证在可重复读的场景下,同一个session读取的数据一致性。

mvcc机制

MVCC(Multi-Version Concurrency Control) 多版本并发控制机制,对同一行数据的读和写操作默认不会加锁互斥保证隔离型,提高性能,而串行化隔离级别为了保证较高的隔离型是将所有操作通过互斥来实现的。

Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。

原理

其实undo日志链是指一行数据被多个事务依次修改过后,每个事务修改完后,mysql都会保留修改前的数据undo 回滚日志,并且添加两个隐藏字段trx_idroll_pointer 将undo日志链串联形成一个历史记录版本链。 通过数据快照的方式。关键核心是undo日志和readView

什么时候会生产trx-id ?
在begin transaction的时候并不会新建,在执行到他们之后的第一个修改操作InnoDB表的语句的时候,事务才真正启动,向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的

【数据库】聊聊MVCC机制与BufferPool缓存机制,# 数据库原理,数据库,缓存

一个案例

【数据库】聊聊MVCC机制与BufferPool缓存机制,# 数据库原理,数据库,缓存

mysql> CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `k` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, k) values(1,1),(2,2);

【数据库】聊聊MVCC机制与BufferPool缓存机制,# 数据库原理,数据库,缓存
最终结果事务A读取的是1,而事务B读取的是3。为什么是这样,我们来分析一下。

【数据库】聊聊MVCC机制与BufferPool缓存机制,# 数据库原理,数据库,缓存
假设在事务A开始的时候只有一个transaciton id = 1, 那么事务A就是2,事务B就是3,事务C就是4.

事务A的试图数组就是[1,2] 事务B视图数组[1,2,3] , 事务C视图数组[1,2,3,4];
当事务C进行修改k=k+1 ,就将id=1的k 设置为2。但是接着事务B也加1操作,此时事务B的+1操作其实是当前读,也就是获取最新的数据,k=2, 在k=2的基础上+1 操作,那么k=3。所以事务B的K值事3。但是事务A的视图数组[1,2] 查询undo日志链,发现 【3,4】都查看不了,所以k=1;

对比规则

  1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;

  2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的 trx_id 就是当前自己的事务是可见的);

  3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况
    a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务是可见的);
    b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见

一个简易的版本就是

  • 版本未提交,不可见;
  • 版本已提交,但是是在视图创建后提交的,不可见;
  • 版本已提交,而且是在视图创建前提交的,可见。

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取 同一条数据在版本链上的不同版本数据。

不同的读操作

select * from table where ?; 
select * from table where ? lock in share mode; # 加读锁 select * from table where ? for update;# 加写锁
insert into table values (...);# 加写锁
update table set ? where ?;# 加写锁
delete from table where ?;# 加写锁
# 所有以上的语句,都属于当前读,读取记录的最新版本。并且,读取之后,还需要保证其他并发 事务不能修改当前记录,对读取记录加锁。
# 其中,除了第一条语句,对读取记录加读锁外,其他的操作都加的是写锁。

【数据库】聊聊MVCC机制与BufferPool缓存机制,# 数据库原理,数据库,缓存
那么思考一个逻辑。如果一个事务A 对id=1更新操作的时候,还没有提交,那么事务B也对id=2更新操作,会出现什么情况?

答案就是会阻塞事务B,必须等事务A执行完毕。

【数据库】聊聊MVCC机制与BufferPool缓存机制,# 数据库原理,数据库,缓存

bufferpool缓存

【数据库】聊聊MVCC机制与BufferPool缓存机制,# 数据库原理,数据库,缓存
在我们更新一条SQL数据的时候,大概流程如下
1.构建连接、查询缓存、分析器、优化器、执行器
2.在执行器的时候

  • 如果buffer pool有对应的页数据,直接获取,否则从磁盘加载对应的id=1的数据 name=zhuge。
  • 将name=‘zhuge’ 进行写入undo日志文件中,(主要方式如果事务进行回滚的话,可以直接恢复数据)
  • 更新内存中的buffer pool的数据 name=‘zhuge 666’
  • 写入redo log日志。准备阶段。 (系统宕机,用于恢复数据 重做)
  • 写入bin log日志,然后提交事务。

我们来思考下,为什么需要设计一套这么复杂的,因为主要是对于磁盘的操作是随机IO性能不高,可以通过写入LOG文件,提升性能。先更新到BufferPool中,然后顺序写日志文件。也可以保证各种异常情况下数据的一致性。

几个小问题?
1.脏页刷盘的时机?(大概四种 a.redolog满了 binnodl buffer满了 c:myg!正常关闭 d.mysql空闲)
2.如果数据库突然奔溃了,没刷盘的数据是不是就丟了?(不会,redolog防崩溃)
3.如果redo.log没写入磁盘,这时候这部分事务是不是数据就丢了(redolog buffer 里的数据丢了怎么办,redolog buffer记录的是 事务prepare阶段数据(未提交 丢了无所谓))
4.如果redolog在刷盘的时候断电呢。

总结

MySQL的事务是如何保证的,我们用了两篇文章进行详细描述,通过ACID,其中AID是为了保证C。
(隔离性):MVCC原理、(原子性):innodb 事务二阶段提交、D(持久性):事务提交后的数据落盘。以及通过相关的锁机制,来保证。文章来源地址https://www.toymoban.com/news/detail-808103.html

到了这里,关于【数据库】聊聊MVCC机制与BufferPool缓存机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[数据库]——可重复读怎么实现的(MVCC)

    可重复读(repeatable read)定义: 一个事务执行过程中看到的数据,总是 跟这个事务 在 启动时 看到的数据是一致的。 MVCC MVCC, 多版本并发控制 , 用于实现 读已提交 和 可重复读 隔离级别。 MVCC的核心就是 Undo log多版本链 + Read view ,“MV”就是通过 Undo log来保存数据的历史版

    2024年02月09日
    浏览(47)
  • 【数据库】简单聊聊数据库可以做什么,有什么用?

    随着云计算和大数据的兴起,数据库的作用日益突出,因此了解什么是数据库,数据库可以做什么,有什么用是非常必要的。今天我们就来简单聊聊。 数据库是什么? 数据库是一个组织化的数据集合,用于存储大量的结构化数据。通过数据模型、数据结构和数据管理的概念

    2024年01月24日
    浏览(46)
  • 聊聊分布式 SQL 数据库Doris(五)

    阅读 Doris SQL 原理解析,总结下Doris中SQL解析流程: 词法识别:解析原始SQL文本,拆分token 语法识别:将token转换成AST 单机逻辑查询计划:将AST经过一系列的优化(比如,谓词下推等)成查询计划,提高执行性能与效率。 分布式逻辑查询计划:根据分布式环境(数据分布信息

    2024年02月05日
    浏览(52)
  • 聊聊分布式 SQL 数据库Doris(四)

    FE层的架构都能在网上找到说明. 但BE层的架构模式、一致性保障、与FE层之间的请求逻辑,数据传输逻辑等,我个人暂时没有找到相应的博客说明这些的。当然这些是我个人在学习与使用Doris过程中,对内部交互逻辑与实现感兴趣才有这些疑问. 还好现在有GPT这类大模型,有了

    2024年02月05日
    浏览(57)
  • 聊聊分布式 SQL 数据库Doris(七)

    Doris的存储结构是类似LSM-Tree设计的,因此很多方面都是通用的,先阅读了解LSM相关的知识,再看Doris的底层存储与读取流程会清晰透彻很多,LSM基本知识如下: 原理:把各种数据先用log等形式组织在内存中(该数据结构称为MemTable,且有序);到达一定数据量后再批量merge写入磁

    2024年02月05日
    浏览(47)
  • 聊聊分布式 SQL 数据库Doris(九)

    优化器的作用是优化查询语句的执行效率,它通过评估不同的执行计划并选择最优的执行计划来实现这一目标。 CBO: 一种基于成本的优化器,它通过评估不同查询执行计划的成本来选择最优的执行计划。CBO会根据数据库系统定义的统计信息以及其他因素,对不同的执行计划进

    2024年02月05日
    浏览(47)
  • 聊聊分布式 SQL 数据库Doris(六)

    此处的负载均衡指的是FE层的负载均衡. 当部署多个 FE 节点时,用户可以在多个 FE 之上部署负载均衡层来实现 Doris 的高可用。官方文档描述: 负载均衡 。 实现方式 实现方式有多种,如下列举。 开发者在应用层自己进行重试与负载均衡。 JDBC Connector 发现一个连接挂掉,就自

    2024年02月05日
    浏览(52)
  • 聊聊分布式 SQL 数据库Doris(一)

    MPP:Massively Parallel Processing, 即大规模并行处理. 一般用来指多个SQL数据库节点搭建的数据仓库系统. 执行查询的时候, 查询可以分散到多个SQL数据库节点上执行, 然后汇总返回给用户. Doris 作为一款开源的 MPP 架构 OLAP 高性能、实时的分析型数据库,能够运行在绝大多数主流的商

    2024年02月05日
    浏览(44)
  • 聊聊分布式 SQL 数据库Doris(二)

    Doris中,Leader节点与非Leader节点和Observer节点之间的元数据高可用和一致性,是通过bdbje(全称:Oracle Berkeley DB Java Edition)的一致性和高可用实现的。 元数据与同步流程 元数据主要存储四类数据: 用户数据信息. 包括数据库, 表的schema, 分片信息等 各类作业信息. 如导入作业, clo

    2024年02月05日
    浏览(66)
  • 聊聊分布式 SQL 数据库Doris(八)

    密集索引:文件中的每个搜索码值都对应一个索引值,就是叶子节点保存了整行. 稀疏索引:文件只为索引码的某些值建立索引项. 稀疏索引的创建过程包括将集合中的元素分段,并给每个分段中的最小元素创建索引。在搜索时,先定位到第一个大于搜索值的索引的前一个索引

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包