当前位置: 首页 > 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. 下载 官方…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...