【从删库到跑路 | 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中事务的相关内容。大家一定要好好掌握这一部分的内容,因为面试中事务这一部分算是数据库中比较高频的内容,尤其是隔离性这里。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享86个节日PPT,总有一款适合您

分享86个节日PPT,总有一款适合您 86个节日PPT下载链接:https://pan.baidu.com/s/1J09nhufX_3gvT2XxZkKz6Q?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

Paxos 算法

Paxos 算法 介绍 Paxos 算法是第一个被证明完备的分布式系统共识算法。共识算法的作用是让分布式系统中的多个节点之间对某个提案(Proposal)达成一致的看法。提案的含义在分布式系统中十分宽泛,像哪一个节点是 Leader 节点、多个事件发生的…

每天五分钟计算机视觉:AlexNet网络的结构特点

本文重点 在前面的一篇文章中,我们对AlexNet网络模型的参数进行了详细的介绍,本文对其网络模型的特点进行总结。 特点 1、AlexNet的网络结构比LeNet5更深,模型包括5个卷积层和3个全连接层。参数总量大概为249MB。 2、Alex使用了ReLu激活函…

在re:Invent上IBM宣布与亚马逊云科技携手,Amazon RDS for DB2正式亮相

11月29日,IBM在亚马逊云科技re:Invent 2023上宣布,与亚马逊云科技合作推出Amazon Relational Database Service(Amazon RDS)for Db2。这项全新的完全托管云服务旨在简化客户在混合云环境中管理人工智能(AI)…

MDK5改造之格式化以及文件函数注释插件和主题应用

MDK5插件以及主题应用 前言一、主题修改1、主题文件下载2、主题应用 二、插件安装以及使用1.下载插件2、插件使用步骤 前言 为了写代码的心应手,先对MDK5进行改造 提示:以下是本篇文章正文内容,下面案例可供参考 🎉参考了其他大师…

结合贝叶斯定理浅谈商业银行员工异常行为排查

1.贝叶斯定理的数学表达 贝叶斯方法依据贝叶斯定理。关于贝叶斯定理解释如下:首先我们设定在事件B条件下,发生事件A的条件概率,即 ,从数学公式上,此条件概率等于事件A与事件B同时发生的概率除以事件B发生的概率。 上述…

Fiddler抓包工具之Fiddler+willow插件应用

安装Fiddler的安装包地址:fillderwillow 解压后安装fiddler4和willow1.4.*版本。 安装成功后,启动fiddler后会出现willow插件按钮: 说明安装成功。 重定向 willow重定向 进入willow界面后,通过右键->Add Project ->Add Ru…

鸿蒙开发学习笔记

快速入门 配置网络权限 1.打开项目的 module.json5 文件 2.在module 里面写下面代码 3.这样就可以使用网络图片了 4.模拟器上就可以正常显示网络图片了 5.官方文档有相吸说明 6. 华为官方编辑工具使用技巧(内置文档),鼠标移动到标签上&…

对于Kotlin DSL的简单解析与使用

DSL(领域特定语言)是Kotlin所带来的强大语法特性之一,也是Java中所不存在的功能,JetBrain也基于DSL开发出了众多的开源库,Kotlin的开发者可以使用DSL来重构许多已有的代码,甚至有可能做到彻底抛弃HTML,XML,…

Mysql——》int(1)和 int(10)区别

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

零基础打靶—CTF4靶场

一、打靶的主要五大步骤 1.确定目标:在所有的靶场中,确定目标就是使用nmap进行ip扫描,确定ip即为目标,其他实战中确定目标的方式包括nmap进行扫描,但不局限于这个nmap。 2.常见的信息收集:比如平常挖洞使用…

Python标准库:math库【侯小啾python领航班系列(十六)】

Python标准库:math库【侯小啾python领航班系列(十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

【每日一题】找出叠涂元素

文章目录 Tag题目来源题目解读解题思路方法一:哈希表 写在最后 Tag 【哈希表】【数组】【2023-12-01】 题目来源 2661. 找出叠涂元素 题目解读 从左往右遍历 arr 给矩阵 mat 上色,在上色的过程中矩阵的某一行或者某一列的全部被上色了,返回…

(C语言)找出1-99之间的全部同构数

同构数&#xff1a;它出现在平方数的右边。例&#xff1a;5是25右边的数&#xff0c;25是625右边的数&#xff0c;即5和25均是同构数。 #include<stdio.h> int main() {for(int i 1;i < 100;i ){if((i*i % 10 i) || (i*i % 100 i))printf("%d\t%d\n",i,…

Java数据结构之《哈希查找》题目

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我写完…

ChatGPT成为“帮凶”:生成虚假数据集支持未知科学假设

ChatGPT 自发布以来&#xff0c;就成为了大家的好帮手&#xff0c;学生党和打工人更是每天都离不开。 然而这次好帮手 ChatGPT 却帮过头了&#xff0c;莫名奇妙的成为了“帮凶”&#xff0c;一位研究人员利用 ChatGPT 创建了虚假的数据集&#xff0c;用来支持未知的科学假设。…

HarmonyOS应用开发——程序框架UIAbility、启动模式与路由跳转

前言 UIAbility简单来说就是一种包含用户界面的应用组件&#xff0c;用于和用户进行交互。每一个UIAbility实例&#xff0c;对应于一个最近任务列表中的任务。 一个应用可以有一个UIAbility&#xff0c;也可以有多个UIAbility。一个UIAbility可以对应于多个页面&#xff0c;建议…

半监督语义分割综述

paper link&#xff1a;https://arxiv.org/pdf/2302.09899.pdf 1. Introduction 图像分割是最古老、研究最广泛的计算机视觉 (CV) 问题之一。图像分割是指将图像划分为不同的非重叠区域&#xff0c;并将相应的标签分配给图像中的每个像素&#xff0c;最终获得ROI区域位置及其类…

线上CPU飙高问题排查!

https://v.douyin.com/iRTqH5ug/ linux top命令 top 命令是 Linux 下一个强大的实用程序&#xff0c;提供了系统资源使用情况的动态、实时概览。它显示了当前正在运行的进程信息&#xff0c;以及有关系统性能和资源利用情况的信息。 以下是 top 命令提供的关键信息的简要概述…

Linux 内核源码各版本下载

下载地址&#xff1a; kernel/git/stable/linux.git - Linux kernel stable treehttps://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/refs/ 1. Linux 内核的基本概念&#xff1a; 内核是什么&#xff1f; 内核是操作系统的核心部分&#xff0c;负责管理系统…