深入理解 MVCC 与 BufferPool 缓存机制

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
深入理解 MVCC 与 BufferPool 缓存机制


在 MySQL 数据库中,MVCC(Multi-Version Concurrency Control)多版本并发控制机制和 BufferPool 缓存机制是非常紧张的概念,它们对于保证数据的一致性、并发性以及提升数据库性能起着关键作用。本文将深入探究这两种机制,帮助读者更好地理解其原理和应用。
一、MVCC 多版本并发控制机制



  • 隔离性保证

    • MySQL 在可重复读隔离级别下,通过 MVCC 机制来保证事务较高的隔离性。例如,在一个事务中多次实行雷同的 SQL 查询语句,纵然其他事务对数据举行了修改,当前事务的查询结果也不会受到影响。
    • 与串行化隔离级别差别,MVCC 在读写操作时默认不通过加锁互斥来保证隔离性,制止了频仍加锁带来的性能开销,而串行化隔离级别是将全部操作加锁互斥来实现隔离性。
    • MySQL 在读已提交和可重复读隔离级别下都实现了 MVCC 机制。

  • undo 日记版本链与 read view 机制

    • undo 日记版本链:当一行数据被多个事务依次修改时,MySQL 会保留每次修改前的数据 undo 回滚日记,并使用两个隐藏字段 trx_id(事务 ID)和 roll_pointer 将这些 undo 日记串联起来,形成一个历史记录版本链。例如,对于一个 account 表中的记录,每次修改后都会生成新的 undo 日记,记录修改前的数据状态。
    • read view 机制:在可重复读隔离级别下,当事务开启并实行任何查询 SQL 时,会生成当前事务的一致性视图 read - view,该视图在事务结束之前保持稳定(读已提交隔离级别在每次实行查询 SQL 时会重新生成)。read - view 由实行查询时全部未提交事务 id 数组(此中最小的 id 为 min_id)和已创建的最大事务 id(max_id)组成。事务中的 SQL 查询结果需要从对应版本链中的最新数据开始,逐条与 read - view 举行比对,以得到终极的快照结果。
    • 版本链比对规则

      • 如果 row 的 trx_id 落在绿色部门(trx_id < min_id),表现该版本是已提交事务生成的,数据可见。
      • 如果 row 的 trx_id 落在赤色部门(trx_id > max_id),表现该版本是由将来启动的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务则可见)。
      • 如果 row 的 trx_id 落在黄色部门(min_id <= trx_id <= max_id),包括两种情况:

        • 若 row 的 trx_id 在视图数组中,表现该版本是未提交事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务则可见)。
        • 若 row 的 trx_id 不在视图数组中,表现该版本是已提交事务生成的,可见。


    • 对于删除操作,可视为 update 的特别情况,会将版本链上最新数据复制一份,修改 trx_id 为删除操作的 trx_id,并在记录头信息的 deleted_flag 标志位写上 true,表现记录已被删除。查询时,若查到的记录 delete_flag 为 true,则不返回数据。
    • 注意,begin/start transaction 命令并不是事务的真正出发点,实行到它们之后的第一个修改 InnoDB 表的语句时,事务才正式启动,MySQL 才会分配事务 id,且严格按照事务启动顺序分配。

二、Innodb 引擎 SQL 实行的 BufferPool 缓存机制



  • 为何不直接更新磁盘数据

    • 直接对磁盘文件举行随机读写并更新数据性能很差,因为磁盘随机读写性能远低于内存操作。如果来一个哀求就直接更新磁盘文件,数据库无法承受高并发。

  • BufferPool 缓存机制原理

    • MySQL 采取了一套复杂机制,先更新内存中的 BufferPool,然后顺序写日记文件(如 redo 日记)。更新内存性能极高,顺序写磁盘日记文件性能也较高,如许可以保证在较高设置机器上每秒能处理几千的读写哀求,同时保证各种异常情况下的数据一致性。例如,实行一个 update 语句时,数据会先在 BufferPool 中更新,同时记录 redo 日记,后续再根据肯定策略将 BufferPool 中的数据写入磁盘。

三、总结


MVCC 机制通过 read - view 和 undo 版本链比对机制,让差别事务能根据规则读取同一条数据在版本链上的差别版本,保证了事务隔离性。BufferPool 缓存机制则通过先更新内存再写日记的方式,提升了数据库性能并保证数据一致性。理解这两种机制对于优化数据库应用、处理并发事务以及确保数据可靠性都具有紧张意义。在实际应用中,合理利用 MVCC 的隔离级别和 BufferPool 的缓存特性,可以有用进步数据库体系的性能和稳定性,为业务提供可靠的数据支持。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表