当前位置: 首页 > news >正文

Mysql-如何理解事务?

一、事务是什么东西

有些场景中,某个操作需要多个sql配合完成:

例如:

李四这个月剩下的前不够交房租了,找张三借1000元急用:

(1)给张三的账户余额 减去1000元

updata 账户表 set money = money - 1000 where id = 2;

(2)给李四的账户余额 加1000元

updata 账户表 set money = money + 1000 where id = 1; 

试想一下:

如果执行完第一条语句,执行第二条语句之前,出现了严重的问题了(程序破溃,服务器断电了),那不就完了吗,这谁还敢把钱存你这里

所以就引入事务:

所谓事务,就相当于把要执行的多个SQL语句打包成一个整体,这个“整体”在执行过程中就能够做到要么整个都指向完,要么一个都不执行,就可以做到避免上述例子的情况。

但是此处的“一个都不执行”不是SQL语句真的不执行,而是执行到一般如果出错了,数据库会自动进行“还原操作”,相当于把之前的SQL语句进行“撤销”,最终的效果看起来就像是一个都没有执行这样的效果。

我们把这样的机制称为“回滚(rollback)”,同时也把上述的特性称为“原子性”。

之前人们以为“原子”就是不可拆分的最小单位了,我们计算机这边就引入这样的名字

二、数据库怎么知道如何回滚?

不知道大家有没有跟我一样好奇,服务器都断电了,数据库咋知道如何进行“回滚”呢?数据库咋知道之前做出了什么样的修改?

数据库内部存在一系列的“日志体系”,记录到“文件中”,因为是保存到外存上的,既可以应对“程序崩溃”、就连“服务器掉电”也是可以做到回滚的。虽然掉电了,但是回滚日志还是存在的,下次数据库启动的时候就可以根据回滚日志的内容,进行回滚操作了。

那么drop database这样的操作能回滚回来吗?

答案是不能的,因为这样的操作不能放到事务中去执行,并且这也不算是执行出错,算是“正确执行的SQL语句”

三、语法

  1. 开启事务:start transaction;
  2. 执行多条SQL语句;
  3. 回滚或提交:rollback/commit;

注意:rollback代表SQL语句操作操作全部失败,commit即是全部成功。

当我们有这样一张账户表:

李四这个月买了新手机,但是发现房租还没有交,只好找好哥们张三借1000元急用。

结果:

如果是rollback结尾:

结果:

并没有任何变化

开启事务后执行:

开启事务后不执行:

四、事务的四个特性

1.原子性

原子性就是刚刚一直将的内容

2.一致性

描述的是,事务执行前和执行后,数据库中的数据,都是“合法状态”,不会出现非法临时结果的状态。

3. 持久性

事务执行完之后,就会更改硬盘上相应的数据,事务都是会永久生效的

4.隔离性

描述了多个事务并发执行的时候,相互之间产生的影响是怎样的。

并发执行是指:

Mysql是一个“客户端 - 服务器”结构的程序

一个服务器通常都是,给多个客户端提供服务的

那么多个客户端,就同时给这个服务器提交事务来执行,与之相对的,服务器就需要同时执行多个事务,此时就是“并发”执行

 并且这些事务可能会对同一张表进行增删改查,此时就可能会有一些问题:

4.1 脏读

 现在有两个事务:

事务A 和 事务B

其中事务A在针对某个表的数据进行修改

A执行过程中,B去读取这个表的数据

当B读完之后,A把表里的数据又改成别的;

这就会导致,B读到的数据,就不是合法的数据,而是读到了临时性的“脏数据”

 那么我们就约定,在改数据的时候,不能读,也称为“给写操作加锁”

4.2  不可重复读

有三个事务: A  B  C

事务A执行一个修改操作。A执行完毕,提交数据;

接下来事务B执行,事务B读取刚才提交完的数据;

在B读取的过程中,又来了一个事务C,C又对刚才A的数据进行修改;

此时对于事务B来说,后续再读取这个数据,读取的结果就和第一次读到的结果是不一样的。这个过程就叫做“不可重复读”

但是需要注意,是对于事务B来说,多次读取的结果不一样。

但是又来了个事务D读取C改变后的数据,那这个是没有问题的

 那么我们就约定:

一个事务在读取数据的过程中,其他的事务不能修改它正在读的数据,给读加锁

4.3  幻读

相当于不可重复读的“特殊情况”:

现在已经预定好了,改数据的时候不能读,读数据的时候不能改

现在有两个事务: A  B

有一个事务A在读取数据,读的过程中,另外一个事务B,新增了/删除了一些其他数据

此时站在A的视角,多次读取的数据内容虽然一样,但是“结果集“不同,结果集不同,是否算是问题,视情况而定

如何解决?

还是继续约定,只要有事务读取,我就不做任何操作,这样的操作称为“串行化”,什么意思?

如多个客户端,同时提交了多个事务过来,但是服务器一个一个的执行事务(执行完第一个再执行第二个……)

 

五、隔离级别

在Mysql中提供了四个隔离级别。可以通过配置文件设置当前服务器的隔离级别是哪个级别。

设置不同的隔离级别,就会让事务之间的并发执行产生不同的差别,从而会影响到上述的三个问题的情况

1.read uncommitted 

此情况下,一个事务可以读取另一个事务未提交的数据。

此时,就可能会 产生脏读、不可重复读、幻读 三种问题

但是此时,多个事务并发执行程度是最高的,执行速度也是最快的

2.read committed 

这种情况下,一个事务只能读取另一个事务提交之后的数据(给写加锁了),此时,可能会产生 不可重复读,幻读问题 (脏读问题解决了),此时,并发程度会降低,执行速度会变慢但是,事务之间的隔离性提高了

3.repeatable read

这个情况下,相当于是给 写操作 和 读操作 都加锁了.

此时,可能产生幻读问题,解决了脏读和不可重复读问题.

并发程度进一步降低,执行速度进一步变慢,事务之间的隔离性进一步变高了

4.serializable

此时,所以的事务都是在服务器上一个个执行的。

此时,解决了脏读、不可重复的、幻读问题

并发程度最低,执行速度最慢,隔离性最高,数据库最准确

 

那么就根据具体场景选择隔离级别, 对于钱等数据重要的场合就选择serializable,对速度要求高的,就根据需求选择更快的

相关文章:

Mysql-如何理解事务?

一、事务是什么东西 有些场景中,某个操作需要多个sql配合完成: 例如: 李四这个月剩下的前不够交房租了,找张三借1000元急用: (1)给张三的账户余额 减去1000元 updata 账户表 set money money -…...

dify绑定飞书多维表格

dify 绑定飞书和绑定 notion 有差不多的过程,都需要套一层应用的壳子,而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用,个人用户创建企业自建应用。 自定义应…...

QT播放视频保持视频宽高比消除黑边

QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候,由于框架的大小发生变化,导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定,Widget的宽高比和视频宽高比…...

1. IO的基础知识

1.1 流 Java程序通过流执行IO。流是一种抽象,它要么生成信息,要么使用信息。流通过java的IO系统链接到物理设备。所有流的行为方式都是相同的,尽管它们链接的物理设备是不同的。 1.2 字节流和字符流 Java定义了两种类型的流 : 字节流和字符流…...

科普:ROC AUC与PR AUC

在评价二分类模型性能时,有许多评价指标,其中,有一对是用面积AUC(Area Under the Curve)做评价的:ROC AUC与PR AUC 本文我们对ROC AUC与PR AUC进行多维度对比分析: 一、定义与核心原理 维度RO…...

Vue3父组件访问子组件方法与属性完全指南

在Vue3的组件化开发中&#xff0c;父子组件间的通信是核心功能之一。本文将详细介绍五种父组件访问子组件属性/方法的实现方案&#xff0c;包含最新的<script setup>语法糖实践。&#xff08;综合1579&#xff09; 一、ref defineExpose&#xff08;推荐方案&#xff0…...

AI时代保护自己的隐私

人工智能最重要的就是数据&#xff0c;让我们面对现实&#xff0c;大多数人都不知道他们每天要向人工智能提供多少数据。你输入的每条聊天记录&#xff0c;你发出的每条语音命令&#xff0c;人工智能生成的每张图片、电子邮件和文本。我建设了一个网站(haptool.com)&#xff0c…...

Android APK组成编译打包流程详解

Android APK&#xff08;Android Package&#xff09;是 Android 应用的安装包文件&#xff0c;其组成和打包流程涉及多个步骤和文件结构。以下是详细的说明&#xff1a; 一、APK 的组成 APK 是一个 ZIP 格式的压缩包&#xff0c;包含应用运行所需的所有文件。解压后主要包含以…...

TCP长连接与短连接

TCP长连接与短连接 TCP&#xff08;传输控制协议&#xff09;中的长连接和短连接是两种不同的连接管理方式&#xff0c;各有优缺点&#xff1a; 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时&#xff0c;再重新建立连接。 特点&#xff1…...

C#委托(delegate)的常用方式

C# 中委托的常用方式&#xff0c;包括委托的定义、实例化、不同的赋值方式以及匿名委托的使用。 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c);public delegate string SayHello(string c);&#xff1a;定义了一个公共委托类型 …...

C#从入门到精通(35)—如何防止winform程序因为误操作被关闭

前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发的上位机软件运行起来以后,一般在右上角都有一个关闭按钮,正常情况下点击关闭按钮就能关闭软件,但是不排除我们不想关闭软件,但是因为不…...

docker本地镜像源搭建

最近Deepseek大火后&#xff0c;接到任务就是帮客户装Dify&#xff0c;每次都头大&#xff0c;因为docker源不能用&#xff0c;实在没办法&#xff0c;只好自己搭要给本地源。话不多说具体如下&#xff1a; 1、更改docker的配置文件&#xff0c;添加自己的私库地址&#xff0c…...

Sqlserver安全篇之_TLS的证书概念

证书的理解 参考Sqlserver的官方文档https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/certificate-overview?viewsql-server-ver16 TLS(Transport Layer Security)传输层安全和SSL(Secure Sockets Layer)安全套接字层协议位于应用程序协议层和TCP/…...

Kafka生产者相关

windows中kafka集群部署示例-CSDN博客 先启动集群或者单机也OK 引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.9.0</version></dependency>关于主题创建 理论…...

技术问题汇总:前端怎么往后端传一个数组?

场景 现在一个专门负责复习算法的服务&#xff0c;筛选出了用户今天需要复习的笔记的ids&#xff0c;现在要调用笔记服务根据ids查询的接口。 请问复习服务怎么将ids发到笔记服务&#xff0c;笔记服务怎么接收。 思路 发的时候肯定是用字符串&#xff0c;接收的时候&#xf…...

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;库框架设计的详细学习教程。通过本文&#xff0c;读者将从零开始&#xff0c;逐步掌握STM32F407的基本知识、HAL库的配置步骤…...

智能图像处理平台:图像处理配置类

这里我们先修改一下依赖&#xff0c;不用JavaCV&#xff0c;用openCV。 导入依赖&#xff1a; <!-- JavaCV 依赖&#xff0c;用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…...

【图文详解】什么是微服务?什么是SpringCloud?

目录 一.认识微服务架构 ??微服务带来的挑战 二.微服务解决方案SpringCloud ??SpringCloud的版本 ??SpringCloud和SpringBoot的关系 ??SpringCloud实现方案 Spring Cloud Netfix Spring Cloud Alibaba ??Spring Cloud 实现对比 在入门Spring Cloud 之前&…...

基于ssm的校园跑腿管理系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统共有管理员、用户两个角色 管理员主要的功能用户信息管理、任务信息管理、任务类型管理、接单信息管理、公告信息管理、投诉信息管理、公告类型管…...

5个GitHub热点开源项目!!

1.自托管 Moonlight 游戏串流服务&#xff1a;Sunshine 主语言&#xff1a;C&#xff0c;Star&#xff1a;14.4k&#xff0c;周增长&#xff1a;500 这是一个自托管的 Moonlight 游戏串流服务器端项目&#xff0c;支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...