MySQL--InnoDB的一次更新事务实现流程与二阶段提交

这篇具有很好参考价值的文章主要介绍了MySQL--InnoDB的一次更新事务实现流程与二阶段提交。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

InnoDB更新事务流程
涉及内容
  • 一次InnoDB的事务更新操作涉及Buffer Pool,BinLog,RedoLog,UndoLog和物理磁盘。

Buffer Pool:

  • Buffer Pool是InnoDB引入的中间层:内存上的一块连续空间,用来缓存数据页,每个数据页的大小为16KB。它的存在是为了提高SQL的读写性能,避免每次查询和修改都直接与磁盘进行交互。于是,每次读取数据的时候,InnoDB会先检查Buffer Pool中是否存在该数据,存在则直接从内存中取,若不存在,再去磁盘中获取,获取后将该数据所在的页复制一份存入Buffer Pool。这样做,避免了频繁的磁盘读取,从而可以提高查询性能。

BinLog:

  • BinLog是MySQL用来记录所有DDL和DML语句的二进制文件,用于数据库的数据备份,数据复制等操作。为了支持高并发,数据库有时会进行读写分离,主库的数据通过BinLog日志来同步复制给从库。

RedoLog:

  • RedoLog是MySQL用于实现数据持久化和崩溃恢复的一种机制,在事务执行过程中,MySQL会将事务做的改动记录到RedoLog中。当系统发生崩溃或数据异常时,RedoLog可以进行数据库重启后的恢复工作,保证了数据库事务的持久性。

UndoLog:

  • UndoLog用于事务的回滚操作,当一个事务执行过程中,MySQL会将修改前的数据记录到UndoLog中,如果事务发生了异常需要回滚,则从UndoLog中找到对应的记录执行,以撤销事务的操作,确保事务的原子性和一致性。此外,UndoLog还支持MVCC(多版本并发控制)机制,用于在并发事务执行时,提供一定的隔离性。
完整的更新流程步骤
  1. 在Buffer Pool中读取数据,若该数据不在Buffer Pool中,则从磁盘读取该数据所在的数据页放入Buffer Pool中。
  2. 记录UndoLog,在数据修改前,InnoDB会在UndoLog中记录修改前的数据。UndoLog最开始写在内存中,由后台线程定时刷入磁盘。
  3. 在Buffer Pool中执行Update语句,更新数据。然后将更新后的数据页状态设置为脏页(dirty page),表示该页已修改但未刷入磁盘。
  4. 记录RedoLog,InnoLog将修改操作写入RedoLog buffer pool中,此时为二阶段提交的prepare阶段。
  5. 记录BinLog,在提交过程中,InnoDB会将事务提交信息记录到BinLog中。BinLog中记录的信息包括:事务开始时间,数据库名,表名,事务ID,SQL语句等。后续通过Binlog进行主从复制。将BinLog写入磁盘中,完成后将RedoLog也写入磁盘。此为二阶段提交的commit阶段。
  6. 写入磁盘,在提交过程后,InnoDB会将Buffer Pool里的脏页写入磁盘,以保证数据库的持久性。这个写入过程是后台线程异步执行的,具有延迟性。

注意:在BinLog和RedoLog写入的时候,是分了两个阶段,以二阶段提交的方式来保证一致性。文章来源地址https://www.toymoban.com/news/detail-787648.html

二阶段提交
二阶段提交的步骤
  • prepare阶段
    • 这个阶段SQL成功执行并生成RedoLog,并处于准备阶段。
  • commit阶段
    • BinLog持久化:通过write()方法将BinLog写入文件缓冲区,再通过fsync()将文件缓存区中的BinLog写入磁盘。
    • RedoLog写入磁盘。
为什么需要二阶段提交
  • 采用二阶段可以保证BinLog日志和RedoLog日志的一致性。如果二者的一致性不能保证,那么主从库的数据就会出现不一致。
  • 如果RedoLog写入成功,而BinLog还未写入成功,此时主库崩了,那么重启后,主库可以通过RedoLog恢复数据,但是BinLog日志的数据没写成功,那么主从同步后,从库便缺少了相关的数据。
  • 如果BinLog写入成功,而RedoLog还未写入成功,此时主库崩了,那么重启后,主库可以无法RedoLog恢复丢失的数据,仍是事务执行前的状态,但是BinLog日志的数据已经写成功,那么主从同步后,从库会得到事务执行后的数据。
二阶段提交如何保证一致性
  • 若在prepare阶段数据库崩溃了,此时RedoLog已经写完,状态在prepare阶段,而BinLog没有成功写入,那么重启后根据RedoLog记录的事务id将对应事务进行回滚。
  • 若RedoLog在prepare阶段,而BinLog已经写入成功的时候数据库崩溃了,则重启后,若事务id对应的BinLog已经写入磁盘了,则即使RedoLog还没有commit,MySQL也要提交该事务。
  • 通过二阶段提交,保证了RedoLog和BinLog的一致性。

到了这里,关于MySQL--InnoDB的一次更新事务实现流程与二阶段提交的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 记录开发环境docker上的一次springboot无法读取更新的配置文件的问题

    背景:一般开发环境的管理不是很严格,当对代码进行一些组件的添加时,往往需要修改spring的配置文件,有的时候为了保险起见,回预先备份原本的配置文件,我采取在./config中创建了一个名为bak-日期的目录,将原本的配置文件mv到该目录下,将新的配置文件移到config目录

    2024年02月11日
    浏览(46)
  • 请你来了解一下Mysql-InnoDB中事务的两段式提交

    A:原子性 原子性表示把一个事务中所有的操作视为一个整体,要么全部成功,要么全部失败,是事务模型区别文件系统的重要特征之一 C:一致性 官方对一致性的解释为事务将数据库从一种状态转变为下一种一致性状态,在事务开始之前和食物结束以后,数据库的完整性约

    2024年01月23日
    浏览(288)
  • MySQL InnoDB什么时候更新索引的统计信息?

    MySQL InnoDB的索引统计信息在什么时候更新呢? 或者说什么事件会触发InnoDB索引的统计信息更新呢?下面结合参考资料 When Does InnoDB Update the Index Statistics? (Doc ID 1463718.1) [1] 简单总结梳理一下(文中大部分知识点来自参考资料)。 ANALYZE TABLE命令会 显式强制 更新表的索引统计信

    2024年02月08日
    浏览(34)
  • MySQL系统表information_schema.INNODB_TRX详解及查看当前运行事务

    在日常管理数据库的过程中,有时需要查询MySQL数据库是否正在有正在执行的事务,便于排查业务问题。MySQL的系统库表有数据维护对应的信息,就在 information_schema 库中的 INNODB_TRX 表,包含事务中是否存在锁,事务开启时间,事务执行的语句等等。 SELECT * FROM information_schema

    2024年02月16日
    浏览(80)
  • InnoDB 事务是如何通过日志来实现的?一个简单的update?

    InnoDB事务通过日志来实现事务的ACID特性: 原子性(A) :InnoDB使用undo log来实现事务的原子性。当事务执行修改时,首先将修改前的数据记录到undo log中,然后再执行修改。如果事务需要回滚,可以使用undo log将数据回滚到修改前的状态。 持久性(D) :持久性是通过redo log来

    2024年02月05日
    浏览(35)
  • 记一次批量更新mysql数据过程

    一、前言 需求背景:mysql数据库中有一个表的数据(600多万)有一个字段的内容需要解密再通过另外一种加密方式进行加密再回存。通过java程序计算完成更新。 二、方案一 一条条计算更新。这里是将手机号解密,在通过另外一种方式回存。 算法步骤: 1、查询需要解密的数

    2024年02月10日
    浏览(35)
  • mysql(八)事务隔离级别及加锁流程详解

    锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制 在数据库中,除传统计算资源(CPU、RAM、IO等)的争抢,数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性,有效性,是所有数据库必须要解决的问题。 锁冲突也是影响数据库并发访问性能

    2024年02月11日
    浏览(51)
  • postgresql 内核源码分析 事务提交回滚状态记录 clog机制流程,commit log文件格式,事务状态为什么单独记录的原因,分组优化及leader更新机制

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 ​ 开源贡献 : toadb开源库 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. PostgreSQL是一种开源的关系型数据库管理系统,其内核源码的分析对于深入理

    2024年02月08日
    浏览(53)
  • MySQL 数据存储和优化------MySQL索引原理和优化 ---- (架构---索引---事务---锁---集群---性能---分库分表---实战---运维)持续更新

    Mysql架构体系全系列文章主目录(进不去说明还没写完) https://blog.csdn.net/grd_java/article/details/123033016 本文只是整个系列笔记的第二章:MySQL索引原理和优化,只解释索引相关概念。 索引可以提高查询效率,影响where查询和order by排序,它可以从多方面进行分类,但是实际创建时

    2024年02月02日
    浏览(50)
  • MySQL性能优化盲区(高并发情况下,事务内的数据先更新还是先查询?)

    近期看到了一个前阿里资深开发的学术分析视频: 高并发情况下,一个事务内有更新操作还有查询操作,那是先更新好,还是先无锁查询好? 仅70秒的视频,深感学问太深,但是海哥讲的有待补充,于是写下了这篇文章,作为补充。 鸣谢:前阿里资深开发极海Channel的技术分

    2024年03月15日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包