快速理解mysql事务

server/2024/10/22 11:06:06/

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/server/13379.html

相关文章

restful请求风格的增删改查-----修改and删除

一、修改&#xff08;和添加类似&#xff09; 前端&#xff1a; <script type"text/javascript">function update(){//创建user对象var user {id:$("#id").val(),username:$("#username").val(),password:$("#password").val…

新技术前沿-2024-大型语言模型LLM的本地化部署

参考快速入门LLM 参考究竟什么是神经网络 1 深度学习 1.1 神经网络和深度学习 神经网络是一种模拟人脑神经元工作方式的机器学习算法,也是深度学习算法的基本构成块。神经网络由多个相互连接的节点(也称为神经元或人工神经元)组成,这些节点被组织成层次结构。通过训练,…

大型组网使用BFD提高可靠性

学习目标&#xff1a; 1. 当前现网业务存在哪些问题&#xff1f; 2. BFD的工作机制讲解&#xff1b; 3. BFD联动静态路由及OSPF实战&#xff1b; -- BFD - 双向转发检测 -- 通用技术 - 各厂商都支持 - 介质无关 - 协议无关 - 规划地址和配置地址&#xff1a; …

【python】随机模拟——赶火车问题、醉汉回家

问题描述 1.赶火车问题。2.模拟二维随机游动&#xff08;醉汉回家&#xff09; 1.赶火车问题。 一列列车从A站开往B站&#xff0c;某人每天赶往B站上车。他已经了解到火车从A站到B站的运行时间是服从均值为30min&#xff0c;标准差为2min的正态随机变量。火车大约下午13&#…

C++设计模式:适配器模式(十四)

1、定义与动机 定义&#xff1a;将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 动机&#xff1a; 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将“一些现存的对象”放在新的环境…

GPT-3和自然语言处理的前沿:思考AI大模型的发展

引言 自然语言处理&#xff08;NLP&#xff09;是人工智能&#xff08;AI&#xff09;领域中最富有挑战性和活跃的研究领域之一。近年来&#xff0c;随着深度学习技术的发展和计算能力的提高&#xff0c;大型语言模型&#xff0c;尤其是OpenAI的GPT-3&#xff0c;已成为推动该…

Vue js闭包

JavaScript闭包详解 在JavaScript中&#xff0c;闭包是一个非常重要的概念&#xff0c;也是JavaScript区别于其他语言的一大特色。理解闭包不仅有助于提升我们的编程技能&#xff0c;还能让我们更好地利用JavaScript的特性和优势。本文将详细解析闭包的概念、原理、应用以及相…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收&#xff0c;也就是说单片机可以自动适应上位机的波特率设置。…