首页 > 数据库 >MySQL 学习笔记 进阶(InnoDB引擎 下)

MySQL 学习笔记 进阶(InnoDB引擎 下)

时间:2024-08-01 15:06:40浏览次数:15  
标签:事务 快照 log 记录 undo InnoDB MySQL 日志 进阶

InnoDB引擎

 

InnoDB引擎-事务原理-概述

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

 

InnoDB引擎-事务原理-redo log

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者在内存中,后者在磁盘中。当事务提交时候会把所有修改信息都存在该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。

 

InnoDB引擎-事务原理-undo log

回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和MVCC(多版本并发控制)。

undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。

Undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的rollback segment回滚段中,内部包含1024个undo log segment。

 

InnoDB引擎-MVCC-基本概念

  • 当前读

读取的是最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select ... lock in share mode(共享锁),select ... for update,update,insert,delete(排他锁)都是一种当前读。

  • 快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

Read Committed:每次select都生成一个快照读。

Repeatable Read:开启事务后第一个select语句才是快照读的地方。

Serializable:快照读会退化为当前读。

  • MVCC

全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段,undo log日志,readView。

 

InnoDB引擎-MVCC-隐藏字段

 

InnoDB引擎-MVCC-undo log版本链

  • undo log

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。

当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。

而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。

  • undo log版本链

 

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链接,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

 

InnoDB引擎-MVCC-read view介绍

ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。

ReadView中包含了四个核心字段:

 

 不同的隔离级别,生成ReadView的时机不同:

  • READ COMMITTED:在事务中每一次执行快照读时生成ReadView。
  • REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

 

标签:事务,快照,log,记录,undo,InnoDB,MySQL,日志,进阶
From: https://www.cnblogs.com/handsome-zyc/p/18336431

相关文章

  • mysql优化sql:EXPLAIN各语法解释:
    当我们谈论数据库性能优化时,EXPLAIN是一个非常有用的工具,用于分析查询语句的执行计划。它能帮助我们理解数据库是如何执行查询的,以及是否能有效利用索引和其他优化策略。下面是一些关键的概念和术语,帮助你理解如何分析EXPLAIN的输出以优化查询性能:1.执行计划基础执行EXPLAI......
  • ETL数据集成丨快速将MySQL数据迁移至Doris数据库
    随着大数据技术的迅速发展,越来越多的企业开始寻求高效、灵活的数据存储与分析解决方案。ApacheDoris(原名Palo)作为一款高性能的MPP(大规模并行处理)分析型数据库,凭借其在OLAP场景下的卓越表现,逐渐成为数据仓库和商业智能领域的优选方案之一。本文旨在详细介绍如何利用ETLCloud平台,......
  • 四、MySQL函数
    MySQL函数常用函数SELECTNOW()SELECTCURDATE()聚合函数函数名称描述COUNT()计数SUM()求和AVG()平均值MAX()最大值MIN()最小值......--聚合函数--都能统计表中的数据(想查询一个表中有多少记录,使用count)SELECTCOUNT(borndate)FR......
  • 超详细的MySQL CRUD 并配备了大量的测试用例, 包教包会
    MySQL数据库表的增删查改CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)Create​INSERT[INTO]table_name[(column[,column]…)]VALUES(value_list)[,(value_list)]…value_list:value,[,value]…insert语句主要有两种情况,一种是全行插......
  • 使MySQL 8.5支持“Asia/Shanghai”格式时区配置
    默认情况下,MySQL不支持设置“Asia/Shanghai”格式时区信息,如根据数据记录的时区信息去转换时间时,会发生意想不到的空。“表达式1”会返回正常的时间转换结果:--表达式1SELECTCONVERT_TZ('2024-08-0111:04:04','+00:00','+08:00');“表达式2”会返回NULL:--表达式2SELE......
  • nodejs 使用 sequelize 实现 mysql数据库的批量插入
    直接上代码:/***设置mysql连接,返回连接实例。连接格式:账户:密码@数据库地址/具体数据库名称***/constsetConnect=()=>{constsequelize=newSequelize(`mysql://${你的mysql地址}`,{logging:(...msg)=>Logger.INSTANCE.inf......
  • 从MySQL大量数据清洗到TiBD说起
    一、业务背景公司主要做的业务是类似贝壳的二手房租售,数据库中存了上亿级别的房源数据,之前数据库使用的是mysql,后面需要将mysql数据库切换成了Tidb,在切换的过程中,需要将老库的数据经过数据清洗后再存入新库(因为有一些表结构的设计变了),其中我们处理的一个逻辑就是将房间......
  • MySQL安装教程(保姆级)
    1.首先要了解自己的计算机打开设置——系统——系统信息然后就可以知道自己计算机的类型了。2.下载MySQL2.1.来到MySQL官网点击进入我们下拉页面,可以找到DOWNLOADS页面默认给咱们选择最新的版本,咱们不用,咱们尽量选一个稳定的版本。而且,版本过高后,就没......
  • mysql复习
     一、DELETE和TRUNCATE的用法DELETE用法DELETE命令用于从数据表中删除指定的记录。其基本语法如下:DELETEFROM表名WHERE条件;示例:DELETEFROMemployeesWHEREemployee_id=100;上述示例将从employees表中删除employee_id为100的记录。......
  • MySQL 中 Varchar(50) 和 varchar(500) 有什么区别?
    问题我们在设计表结构的时候,设计规范里面有一条如下规则:对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。为什么这么规定,主要基于两个方面基于存储空间的考虑基于性能的考虑网上说Varchar(50)和varchar(500)存储空间上是一样的,真的是这样吗?基于性......