快速理解mysql事务

devtools/2024/9/24 12:29:00/

mysql_0">什么是mysql事务?

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

mysql_4">mysql事务特性

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

对于这ACID四大特性,其实分为两个部分,其中的原子性,一致性和持久化实际上是由InnoDB中的两份日志来保证的,一份是redo log日志。而隔离性是通过数据库的锁,加上MVCC来保证的。
在这里插入图片描述

redo log

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

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

如果没有redo log,可能会发生的问题:

在InnoDB引擎中的内存结构中,主要的内存区域就是缓冲池,在缓冲池里缓存了很多数据页。在一个事务里,当执行多个增删改操作时,InnoDB会先操作缓冲池里的数据,如果缓冲区没有对应的数据,会先通过后台线程将磁盘中的数据加载出来,存放到缓冲区后,再对缓冲区里的数据进行增删改,修改之后的数据页称为脏页。而脏页会在一定的时机,通过后台线程刷新到磁盘里,从而保证缓冲区和磁盘里的数据一致。而缓冲区的数据不是实时刷新的,而是一段时间后刷新。假设**刷新到磁盘过程出错了,而提示给用户事务提交成功,**数据却没有持久化下来,这就没有保证事务的持久性。

引入redo log之后

对缓冲区的数据进行增删改之后,会先将操作的数据页的变化记录在redo log buffer中,在事务提交时将redo log buffer里的数据刷新到redo log磁盘文件里。过一段时间后,如果刷新到磁盘里的脏页出现错误,就可以借助redo log文件进行恢复,保证了事务的持久性。如果脏页刷新到磁盘或涉及到的数据已经落盘,redo log没有用之后,就可以进行删除了,所以存在两个redo log是循环写的。
在这里插入图片描述

为什么每一次提交事务,刷新到磁盘是redo log文件,而不是缓冲池里的脏页?

在业务操作中,操作数据一般都是随机读写磁盘的,而不是顺序读写磁盘。而redo log在往磁盘文件中写入数据,由于是日志文件,顺序写的,效率远大于随机写。这种先写日志的方式,称之为WAL。

undo log

回滚日志,用于记录数据被修改前的信息

作用(2个)

提供回滚(保证事务的原子性)和MVCC(多版本并发控制)。

undo log和redo log不一样,它是逻辑日志,当delete一条记录时,undo log中会记录一条与它相反的insert记录,当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容进行回滚。

  • undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还会用于MVCC。
  • undo log存储:采用段的方式进行管理和记录,存放在rollback segment回滚段中,内部包括1024个undo log
    segment。

MVCC

(1)当前读:

读取的是记录的最新版本,读取时还保证其他并发事务不能修改当前记录,会对当前读取的记录进行加锁,例如:select … lock in share mode(共享锁),select … for update、update、insert、delete(排他锁)都是一种当前读。
在这里插入图片描述

(2)快照读:

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

  • RC:每次select,都生成一个快照读。
  • RR:开启事务后的第一个select才是快照读的地方。
  • 串行化:快照读后退化为当前读。
    在这里插入图片描述
    在这里插入图片描述
(3)MVCC

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

隐藏字段

创建表时,InnoDB会自动为我们添加三个隐藏字段
在这里插入图片描述

undo log日志

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

当insert时,产生的undo log日志只在回滚时需要,事务提交后自动删除。

而update,delete时,产生的回滚日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。
在这里插入图片描述

readView

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

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/devtools/13273.html

相关文章

【1646】医院人员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 医院人员管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

创建型设计模式

七大原则 1. 开闭原则(Open-Closed Principle, OCP) 详解:软件实体(类、模块、函数等)应该易于扩展,但是不易于修改。换句话说,当软件需求变化时,应该通过添加新代码来实现变化&am…

求臻医学MRD产品斩获2023年度肿瘤标志物年度十大创新技术产品奖

2024年4月20日,中国肿瘤标志物学术大会开幕式暨名家讲坛在南京隆重召开! 会议期间,中国抗癌协会肿瘤标志专业委员会联合中国抗癌协会肿瘤临床检验与伴随诊断专业委员会、中国抗癌协会肿瘤基因诊断专业委员等共同发布“2023 年度肿瘤标志物创新技术产品”…

PSA Group EDI 需求分析

PSA集团(以下简称PSA)中文名为标致雪铁龙集团,是一家法国私营汽车制造公司,致力于为全球消费者提供独具特色的汽车体验和自由愉悦的出行方案,旗下拥有标致、雪铁龙、DS、欧宝、沃克斯豪尔五大汽车品牌。 汽车制造企业对…

.net9 AOT编绎生成标准DLL,输出API函数教程-中国首创

1,安装VS2022预览版(Visual Studio Preview) https://visualstudio.microsoft.com/zh-hans/vs/preview/#download-preview 2,选择安装组件:使用C的桌面开发 和 .NET桌面开发 ------------------------------------- …

检索算法和技术的本质回顾

目录 一、数据结构和存储特点对检索效率的重大影响总结 二、数组和链表的线性结构检索 (一)基本分析 (二)使用二分查找提升数组检索效率 (三)灵活改造链表提升检索效率 问题背景 解决方案 歌曲块链…

Linux - sed (stream editor) cp > bak备份 head

替换 my.yaml 的 ‘t’ 为 ‘AAA’ sed s/t/AAA/g my.yaml sed -n /^[as]/p my.yaml 这个命令的 -n 选项表示不自动打印每一行,/^[as]/p 是一个 sed 命令,/^[as]/ 是你想要匹配的正则表达式(所有以 a | s 开头的行&#x…

程序员过了35岁没人要?“这行越老越香”

程序员35岁失业?参加完OceanBase开发者大会,我又悟了! 周六参加了OceanBase2024 开发者大会的现场,来之前我其实挺忐忑的,我觉得一个数据库产品的发布会,能有什么新鲜的东西? 踏入酒店的那一刻&…