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

【从删库到跑路 | MySQL总结篇】事务详细介绍

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【MySQL学习专栏】🎈
本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 一、事务
  • 二、MySQL事务的基本特性
  • 三、四种事务的隔离级别

一、事务

事务概念:
事务可以看作是由一个或多个 SQL 语句组成的逻辑单元,在这个单元中,每个 SQL 语句都是相互依赖的。整个事务单元被视为一个不可分割的整体(比如我们高中物理学习到的原子,原子就是不可分割的最小单位),要么全部执行成功,要么全部回滚。

举个栗子:假设现在事务中存在3个操作,我们先执行第一个操作,在执行第二个操作,最后在执行第三个操作。好了,如果执行到第二个操作的过程中执行失败了,MySQL就会自动把之前已经执行成功的操作进行还原(此操作我们称之为回滚),还原成最初什么都没有执行的状态。

回滚是如何实现的:
把数据库中执行的每个SQL操作都记录下来(通过数据库来记录事务操作的中间过程),如果需要回滚,就需要按照之前的逆操作来进行执行就可以了(比如上个操作是插入,那么逆操作就是删除;上个操作是修改,逆操作改回去就好了)。
再比如,如果我们执行某个事务的第二步过程中,程序崩溃了,此时我们就需要对第一步就行回滚操作,即把对第一步执行的操作给修改还原回去。即使是数据库挂了或者数据库服务器重启了,我们也无需担心,因为数据库通过日志来记录事务执行过程中的中间过程,日志中的数据是始终存储在硬盘上的。如果是数据库服务器重启的话就会在服务器重启之后继续对之前没有回滚完的情况进行处理。

事务最重要的一个特性就是原子性了,原子性又是通过回滚操作来保证的,而回滚则是通过特定的日志来实现的。

一个事务中必须以这两个操作为结尾:commitrollback,如果没有这两个操作的话,那么接下来各种mysql都会被认为是工作中的一部分。如果没有这两个操作的话,那么接下来所有的SQL操作都会是认为是事务的一部分。

二、MySQL事务的基本特性

  • 原子性:事务可以看作是一个或多个SQL语句组成的逻辑单元,逻辑单元中的每个SQL语句都是相互依赖的,而整个逻辑单元就是一个不可分割的整体存在(类似于物理学到的原子,原子就是不可分割的最小单位存在)。
  • 一致性:事务执行之前和事务执行之后能够对应上,不能离谱(约束可以检查数据是否合理,回滚机制也可以支持一致性)。
  • 持久性:我们知道硬盘上的存储的数据都是持久化存储。而MySQL中的事务执行的各种操作都是持久生效的(最终都会存储到硬盘中),事务一旦执行成功,这里所有操作产生的修改都会写到硬盘中去。
  • 隔离性(重点):并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出一个权衡,隔离描述的就是同时执行的事务之间产生的相互影响。隔离性越高并发性就会越低,数据就越可靠,性能就会越低。

如何理解隔离性中的并发:
数据库是一个客户端服务器结构的程序。服务器可以在同一时刻给多个用户提供服务。且多个客户端都能给服务器提交事务。
假设提交的两个事务是修改的不同的数据库或者不同的表,那么这两个事务之间是不会产生相呼影响的;如果这两个事务是修改的同一个表,此时就可能会出现一些问题。
我们拿两个事务来进行举例,假设现在有两个客户端都把自己的事务提交给服务器,宏观上来看,这两个事务是同时提交的但在微观上来讲这两个事务总是要分一个先后顺序的。而当事务的执行顺序存在差异的时候,就有可能会影响到最终的执行结果。这就是并发执行事务所带来的一些问题。

并发执行事务时可能会出现的问题:

问题(1)脏读
脏读(Dirty Read):是指一个事务读取了另一个事务尚未提交的数据。换句话说,一个事务读取到了另一个事务“脏”的数据(可以理解为一个临时的数据),即还没有被持久化到数据库中。
假设有两个事务,事务A和事务B。事务A执行了一条更新操作但还未提交,事务B在此时读取了事务A尚未提交的数据。如果事务A回滚了,那么事务B读取到的数据就是无效的或者不准确的,因此称为脏读
如何解决脏读问题:
写操作加锁:事务A在进行写操作的时候,其它事务无法读取事务A进行写操作期间的数据(但可以读取到事务A开始写操作之前的数据),只有事务A的写操作完成提交之后,其它事务才能读取到事务A中的最新数据。

引入了写加锁之后,降低了事务之间的并发性,提高了隔离性,效率会降低但是提高了数据的可靠性。

问题(2):不可重复读
不可重复读:在同一个读取数据的事务中,可能会涉及到多个读操作,而每个读操作读取的数据都不一样。(这里每次读操作读取的数据并非是脏数据,我们可以将其理解为不同版本的数据)
如何解决不可重复读

读操作加锁:给读操作加锁的意思就是在读取一个事务数据的过程中,我们是不能让这个事务进行写操作的。

我们再来区分一下给读操作加锁和给写操作加锁:
给写操作加锁的意思:就是我们在对事务A进行写操作的时候,其它事务是无法读取到事务A中的最新数据(只能读取到事务A进行写操作之前的旧数据),只有当事务A提交写操作之后,其它事务才能读取到事务A中的最新数据。

给读操作加锁的意思:我们在读取事务A数据的时候,此时事务A是不能开启另外一个事务进行写操作的。
读操作加锁之后,事务之间的并发性就会进一步降低,隔离性增加,当然效率降低,数据变得更加可靠。

问题(3):幻读(可以理解为幻读就是不可重复读的特殊情况)
幻读指的是一个事务在多次读的时候虽然每次读到的数据的值是一样的,但是每次读的结果集是不同的。比如第一次读读到的是100条记录,第二次读读到的变成了101条记录。第一次读到的100条记录和第二次读到的100条记录是完全相同的。只不过第二次多读了1条记录。
如何解决幻读:串行化
串行化就是彻底的放弃并发执行,即所有的事务变成了一个挨一个的串行执行(即执行完一个事务后再执行另外一个事务)。
串行话是并发性最低的,隔离性最强的,效率最低,数据也是更加的可靠。

在并发性事务执行的过程中,可能会出现以下问题:

  • 脏读(写加锁解决):读到了写事务提交之前的中间数据(即临时数据)
  • 不可重复读(读加锁解决):一个事务之内多次读取到一个数据,发现每次读取的数据都是不一样的。
  • 幻读(解决方法就是串行化,完全放弃并发执行):一个事务之内多次读到的数据的值是相同的,但是每次读取的结果集不同。

三、四种事务的隔离级别

针对并发事务执行的过程中可能出现的问题,MySQL提供了四种事务的隔离级别

  • read uncommitted(RU):允许读未提交的数据。此时存在脏读、不可重复读、幻读的问题,事务之间隔离性最低,并发程度最高,效率最高且数据的可靠性最低。
  • read committed(RC):只允许读取已提交的数据(相当于给写加锁,解决了脏读的问题),但是还存在不可重复读和幻读的问题。事务间的隔离性提高,并发性降低。数据更可靠与此同时效率降低。
  • repeatable read(默认的隔离级别)(RR):可以重复读取数据(相当于给写操作和读操作都加锁)。事务间的隔离性提高,并发性降低,效率降低,且数据可靠性提高。解决了脏读和不可重复读的问题,但依然存在幻读的问题。
  • serializable:事务彻底地进行串行执行。解决了脏读、不可重复读、幻读这三个问题。此时事务间的隔离性最高,并发性最低(或者说没有并发性),数据最可靠,效率也最低。

以上就是MySQL中四种事务的隔离性级别,当然要根据实际的需求场景来决定具体使用哪一种隔离级别,尽量找到一个效率和可靠性都能够接收的情况。大部分情况下使用默认的MySQL隔离性级别就可以了(repeatable read)。

好了,以上就是本文的全部内容了。讲解了MySQL中事务的相关内容。大家一定要好好掌握这一部分的内容,因为面试中事务这一部分算是数据库中比较高频的内容,尤其是隔离性这里。

嗯,就到这里吧,再见啦友友们!!!
在这里插入图片描述

相关文章:

【从删库到跑路 | MySQL总结篇】事务详细介绍

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、事务…...

七牛云1024创建节-赛后有感

距离比赛结束已经过去快半个月时间,七牛云又发起了有奖征文的活动,正好借此机会记录一下自己参加这次比赛的经历,感受和一些比赛的心得。 如何了解到的比赛信息 其实我很早就开始关注七牛云了,最早是在今年二三月的时候&#xf…...

CSS 选择器优先级,!important 也会被覆盖?

目录 1,重要性2,专用性3,源代码顺序 CSS 属性值的计算过程中。其中第2步层叠冲突只是简单说明了下,这篇文章来详细介绍。 层叠冲突更广泛的被称为 CSS选择器优先级计算。 为什么叫层叠冲突,可以理解为 CSS 是 Cascadi…...

关于src别名的配置之tsconfig.json配置

tsconfig.json {"compilerOptions": {"baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录"paths": { //路径映射,相对于baseUrl"/*": ["src/*"] }} } ① "baseUrl": &…...

Mybatis如何执行批量操作

文章目录 Mybatis如何执行批量操作使用foreach标签 使用ExecutorType.BATCH如何获取生成的主键 Mybatis如何执行批量操作 使用foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach标签的属性主要有item,index&…...

LeetCode 1094. 拼车:优先队列

【LetMeFly】1094.拼车:优先队列 力扣题目链接:https://leetcode.cn/problems/car-pooling/ 车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向) 给定整数 capacity 和一个数组…...

项目开发维护技术文档(总结梳理)

目录 一、项目背景 二、架构设计 1.技术栈 2.架构图 3.代码结构 三、模块划分 1.用户模块 2.商品模块 四、开发规范 1.命名规范 2.代码格式 3.版本控制 五、部署流程 1.环境要求 2.部署流程 六、问题解决 1.数据库连接异常 2.Redis缓存失效 七、参考资料 项…...

01_学习使用javax_ws_rs_上传文件

文章目录 1 前言2 Maven 依赖3 上传接口4 如何解析 MultipartFormDataInput5 结语 1 前言 使用 Spring MVC 来处理文件上传,想必是大家耳熟能详的了,如下代码: ResponseBody PostMapping("/upload") public String upload(Request…...

MFC 发布CLXHHandleEngine动态库1.0.0.0版本

第一版发布以下功能,此项目使用VS2013创建,项目配置包括Unicode的Mdd,md与多字节版本: //MFC Grid表格 #include "../MFCGridCtrl/GridCtrl.h" //使用AES与Base64加密解密可以与java中的AES加解密衔接 //AES加密解密 #include &q…...

MicroPython 基于microdot框架搭建网页服务器

MicroPython 基于microdot框架搭建网页服务器 简介简单demo 简介 Microdot是一个极简的Python web框架,灵感来自于Flask,它被设计用来运行在资源有限的系统上,如微控制器。它运行在标准的Python和MicroPython上。 API参考microdot 资源下载m…...

FL Studio21.2汉化永久中文语言包

FL Studio21.2这款软件在国内被广泛使用,因此又被称为"水果"。它提供音符编辑器,可以针对作曲者的要求编辑出不同音律的节奏,例如鼓、镲、锣、钢琴、笛、大提琴、筝、扬琴等等任何乐器的节奏律动。此外,它还提供了方便快…...

Glide结合OkHttp保证短信验证接口携带图形验证码接口返回Cookie值去做网络请求

一、实现效果 二、步骤 注意:仅展示核心部分代码 1、导入依赖 api com.github.bumptech.glide:glide:4.10.0 kapt com.github.bumptech.glide:compiler:4.10.0 api com.squareup.okhttp3:okhttp:3.11.0 api com.squareup.okhttp3:logging-interceptor:3.11.02、自…...

怎样用Ajax提交from表单并接收其中的json数据

怎样用Ajax提交表单并接收其中的json数据 需求:实现点击按钮后,数据以表单形式提交至服务器,并接收来自服务器的返回数据。过程中页面不刷新。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。AJAX 是与服务器交换数据并…...

【动态规划】LeetCode-746LCR 088.使用最小花费爬楼梯

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…...

Unity 接入TapADN播放广告时闪退 LZ4JavaSafeCompressor

通过跟踪安卓日志,发现报如下错误 Didnt find class "com.tapadn.lz4.LZ4JavaSafeCompressor" 解决方案: 去掉Minify这边的勾选,再打包即可。...

【九】linux下部署frp客户端服务端实践(内网穿透)

linux下部署frp客户端服务端实践 简介: 今天有一个这样的需求,部署在公司内部局域网虚拟机上的服务需要在外网能够访问到,这不就是内网穿透的需求吗,之前通过路由器实现过,现在公司这块路由器不具备这个功能了&#x…...

华为1+x网络系统建设与运维(中级)-练习题2

一.设备命令 LSW1 [Huawei]sys LSW1 同理可得,给所有设备改名 二.VLAN LSW1 [LSW1]vlan ba 10 20 [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type trunk [LSW1-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 [LSW1-GigabitEthernet0/0/1]in…...

自定义类型-结构体,联合体和枚举-C语言

引言 能看到结构体,说明C语言想必学习的时间也不少了,在之前肯定也学习过基本数据类型,包括整型int,浮点型float等等。可是在日常生活中,想要描述一个事物并没有那么简单。比如,你要描述一本书&#xff0c…...

Windows 安装redis,设置开机自启动

Windows 安装redis,设置开机自启动 文章目录 Windows 安装redis,设置开机自启动下载, 解压到指定目录设置redis密码启动redis服务端停止redis服务端设置自启动 下载, 解压到指定目录 官网地址: https://redis.io/ 安装包下载地址: https://github.com/tporadowski/redis/relea…...

Windows安装Mysql Workbench及常用操作

Mysql Workbench是mysql自带的可视化操作界面,功能是强大的,但界面和navicat比,就是觉得别扭,但其实用惯了也还好,各有特色吧。这里记录一下常用的操作。 官方手册:MySQL Workbench 一、安装 1. 下载 官方…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...