MySQL经典面试题:谈一谈你对事务的理解

文章目录

  • 📑事务
    • 事务的基本概念
      • 回滚
      • 开启事务的sql语句
    • 事务的基本特性
      • 总结一下涉及到的三个问题
  • ☁️结语


📑事务

事务的基本概念

事务是用来解决一类特定场景的问题的,在有些场景中,完成某个操作,需要多个sql配合完成的。

比如说:1号给2号转账1000000元
在这里插入图片描述

转账的流程大概是这样的

  1. 给 1 号的账户余额减去1000000,update 账户余额表 set balance = balance - 1000000 where id = 1;
  2. 给 2 的账户余额加上1000000,update 账户余额表 set balance = balance + 1000000 where id = 2;

显然,以上的转账操作,涉及了2个sql语句,在实际开发中,我们一般都是通过C++/Java等这样的语言来实现的,这个时候就涉及到1个问题,我们必须确保两个sql都执行完毕,转账才算完成,如果第一个sql执行完,在执行第二个sql之前,出现严重问题了(程序崩溃,主机断电…),这时候就会使数据库中的内容出错。你的小钱钱可能就会不翼而飞了。

为了避免出现“转账转一半”这样的问题,于是就有了事务。
所谓事务,就相当于是把 多个要执行的sql,打包成一个“整体”,这个“整体”在执行过程中就能够做到,要么整个都执行完,要么就一个都不执行,就可以避免出现上述转账一半的中间状态。

回滚

以上的“一个都不执行”不是这些sql真的没执行,而是执行一半,发现出错的时候,数据库会自动进行“还原操作”,相当于把前面执行过的sql,给进行“撤销”,最终的效果看起来好像就是一个都没执行。 这样的机制,称为“回滚”(rollback)。

  • 举个例子方便理解:
    回滚类似于,我上淘宝买个东西,货拿到手后,我不满意,我就退货~
    商家就会把这个货,重新进行包装,做成好像从来没有卖出去一样,这样就可以继续卖给其他人了。
    重新进行包装的过程,就可以看成是回滚。

同时,也把事务支持的上述的“特性”称为“原子性”(过去人们认为“原子”就是不可拆分的最小单位)。

  1. 数据库是如何知道要怎么回滚呢,如何知道前面的sql做出了啥样的修改呢?

    • 其实,数据库内部存在一系列的“日志体系”,记录在文件中。(把记录存到文件中,既可以应对“程序崩溃”,也能够应对“主机掉电”)。当开启事务的时候,此时每一步执行的sql,都会记录在日志体系中,后续如果需要回滚,就可以参考之前记录的内容,来进行还原。
      在这里插入图片描述
  2. 那么问题来了,drop database这样的操作能不能回滚呢?

    • 不能的,回滚操作只是针对“事务来说的”,开启事务之后,就会记录回滚日志,事务执行过程中,如果出现问题,就会自动触发回滚…(开启事务之后,一个事务内,虽然是执行多个sql,但执行的内容也不能太多…)
      一方面,drop database这样的操作不能放到事务中去执行,
      另一方面,这个操作也不算执行出错,而算是“正确执行了sql”。

事务最核心的特性,就是“原子性”,能够解决的问题,就是批量执行sql的问题。

开启事务的sql语句

-- 开启事务
start transaction;

-- 其他sql
...

-- 提交事务(告诉服务器,over!!)
commit;

但是一般在实际开发中不会使用上述sql
实际开发都是通过“代码”的方式来开启事务,批量执行的…

事务的基本特性

关于事务,在面试中,除了问你基本的概念(上面的内容),还会考察到一个比较麻烦的东西:事务的基本特性。

事务涉及到4个核心特性

  1. 原子性(最重要的特性)
  2. 一致性(事务执行前和执行后,数据库中的数据一定都是合法的数据,不会出现非法的临时结果的状态)
  3. 持久性,事务执行完毕之后,就会修改硬盘上的数据,事务都是会持久生效的。
  4. 隔离性 (非常不好解释)隔离性,描述了 多个事务 并发执行 的时候,相互之间产生的影响是怎样的。如果这些同时执行的事务,恰好也是针对同一个表来进行一些增删改查,此时就可能会引入一些问题。
    1. 脏读
    2. 不可重复读
    3. 幻读问题

并发执行介绍:MySQL是一个“客户端-服务器”结构的程序,一个服务器,通常会给多个客户端同时提供服务,因此很可能,这多个客户端,就同时给这个服务器提交事务来执行,与之相对,服务器就需要同时执行这多个事务,此时就是“并发执行”。

我们来一个一个介绍,可能会有一些烧脑。

  1. 脏读
    在这里插入图片描述

    • 有两个事务 A 和 B 并发执行,其中事务 B 在针对某个表的数据进行修改,B 执行过程中,A也去读取这个表的数据,当A读完之后,B把表里的数据又改成别的,这就导致A读到的数据,就不是最终的“正确数据”,而是读到了临时性的“脏数据”。
    • 举个例子方便理解,假设我是一个老师,我在准备下节课要讲的内容,于是我就准备一个代码 class Student{ … } 。此时,有一个同学,暗中观察,看到了,我这里写了一个class Student,里面有一个id,有一个name,有score…看了一会,就溜了~
    • 当同学走了之后,我想了一下,又对代码做出来修改,把id 改成 studentId,name 改成 studentName,score 改成 studentScore,当后续上课的时候,这个之前看我屏幕的同学,就发现,老师不讲武德,讲的代码和之前他看到的怎么就不一样了呢?

如何解决上述问题呢?

  • 很简单,我和同学们,约定好,我写代码的时候,你们不要看我的屏幕,如果你们想预习下节课的内容,可以来看我的“码云”,我会把修改好的代码,最终提交到码云上。我在修改的时候,同学们不能读,称为“给写操作加锁”。
  1. 不可重复读
    接着上个例子,我已经和同学们约定好,同学们不会看我的屏幕了,而是去我的码云上看代码。

    有一天,我写了一些代码,提交到码云上了,此时有一些同学正在码云上看我的代码,就在他们看的过程中,我发现了,我刚才的提交的代码中有问题,于是我就修改了一下代码,重新提交一次

    此时,以同学们的视角看,代码看着看着,突然就变样了~

    这个问题,就是“不可重复读”

    此时有三个事务ABC,首先事务A执行一个修改操作,A执行完毕的时候,提交数据,接下来事务B执行,事务B读取刚才A提交的数据…在B读取的过程中,又来了一个事务C,C又对刚才A修改的数据再次做出了修改,此时对于B来说,后续再读取这个数据,读到的结果就和第一次读到的结果是不一样的。
    以上过程就叫做“不可重复读”。

如何解决不可重复读?

  • 和上面的解决方法类似,再与同学们进行约定~~
    同学们通过码云看我的代码的时候,我不能修改。(给读操作加锁,一个事务在读取数据的过程中,其他的事务不能修改它正在读的数据)
  1. 幻读
    相当于不可重复读的“特殊情况”
    我与同学们已经约定好了,我在写代码的时候,同学们不能读,同学读代码的时候,我不能去修改(针对同一个代码才有这样的限制)。
    同学们在读studen的时候,此时我创建了另一个代码,Teacher进行编写。此时,站在同学的角度,看到的情况就是,虽然studen没变,但读着读着突然冒出来一个Teacher。
    有一个事务A在读取数据,读的过程中,另外一个事务B,新增了\删除了一些其他的数据…此时站在A的视角,多次读取的数据内容虽然一样,但是“结果集”不同。结果集不同,是否算是问题,需要根据情况来定。

如何解决幻读问题?

  • 还是继续和同学们约定,如果有同学正在读代码,我就不做任何操作。
    这样的操作我们称为“串行化”
    比如多个客户端,同时提交了多个事务过来,但是服务器一个一个的执行事务(执行完第一个事务,再执行第二个,再执行第三个…)

总结一下涉及到的三个问题

在并发执行事务的过程中,涉及到了三个问题:

  1. 脏读
  2. 不可重复读
  3. 幻读
    这三个问题与隔离性有啥关系呢?
    在MySQL中提供了四个隔离级别,可以通过配置文件来设置当前服务器的隔离级别是哪个级别。设置不同的隔离级别,就会使事务之间的并发执行的影响产生不同的差别,从而会影响到上述三个问题是否会发生~
    1. read uncommitted读未提交
      这种情况下,一个事务可以读取另一个事务未提交的数据
      此时,就可能会产生脏读,不可重复读,幻读三种问题
      但是此时,多个事务并发执行程度是最高的,执行速度也是最快的(并发程度越高,速度就越快,并发程度越低,速度就越慢)
    2. read committed 读已提交
      这种情况下,一个事务只能读取另一个事务提交之后的数据(给写操作加锁了)
      此时,可能会产生不可重复读,幻读问题(脏读问题解决了)
      此时并发程度降低,执行速度会变慢,但是事务之间的隔离性提高了(事务之间的相互影响变小了,得到的数据更准了~)
    3. repeatable read 可重复读 (MySQL默认的隔离级别)
      这个情况下,相当于是给写操作和读操作都加锁了
      此时,可能产生幻读问题,解决了脏读和不可重复读问题
      并发程度进一步降低,执行速度进一步变慢,事务之间的隔离性,进一步提高了
    4. serializable 串行化
      此时,所有的事务都是在服务器上一个接一个的执行的
      此时,解决了脏读,不可重复读,幻读问题
      并发程度最低,执行速度最慢,隔离性最高,数据最准确~

在这里插入图片描述

在写代码时我们该如何选哪个隔离级别呢?

  • 答:根据需要,看是需要执行速度快,还是需要数据比较准,从而选择合适的隔离级别,快和准无法兼得。

☁️结语

请给自己些耐心,不要急于求成。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

如有纰漏或错误,欢迎指正


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三分钟了解绿色积分消费增值模式

在现今快速发展的经济环境中,绿色积分消费增值模式悄然在市场上崭露头角,引起了社会各界的广泛关注。这一模式起源于加密货币领域的单边上涨理念,经过精心改良,已经成功融入国内的产品盘项目中,展现出其独特的魅力和价…

嵌入式学习记录6.14(练习)

#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(1028,783); //设置左侧背景QLabel *lab1new QLabel(this);lab1->…

C语言期末考试大纲详解

一: C语言的基本概念 C语言是一种通用的、过程式的计算机编程语言,设计提供了低级内存访问和简单、灵活的语言结构。以下是关于C语言的一些基本概念和组成部分的详细解释。 文件扩展名 .c:这是C语言源代码文件的扩展名。它包含了程序员编…

Mysql学习笔记-SQL优化总结

详细内容参见https://blog.csdn.net/qingwufeiyang_530/article/details/139705898?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139705898%22%2C%22source%22%3A%22qingwufeiyang_530%22%7D

《全网首发》平衡三进制图灵机的构建

PS:以下内容均为本人原创,未经授权及许可,严禁引图、转载或加工,违者必究。 ————2024年6月13号 1、图灵机的概述 图灵机(Turing machine)是一种理论计算模型,由英国数学家阿兰图灵(Alan T…

定个小目标之刷LeetCode热题(16)

针对本题排序流程,主要是将链表拆分为长度为subLength的子链表1和子链表2,然后把子链表1和子链表2合并为一条有序链表,重复上述步骤直到把链表都拆分完,这样这条链表每段长度为2的子链表都是有序的,那么要整条链表有序…

鸿蒙求职面试内容总结——6月3日ZR的FS项目

最近接到了一些公司的入职面试邀约,这里略去公司的和项目的名字,做一些整理分享。 一、长列表如何实现部分渲染,使用的是哪一个API 在鸿蒙系统中,可以使用List组件来实现长列表的部分渲染。List组件支持使用条件渲染、循环渲染、…

快速LLaMA:面向大型语言模型的查询感知推理加速 论文摘要翻译与评论

论文摘要翻译与评论 论文标题: QuickLLaMA: Query-aware Inference Acceleration for Large Language Models 提出的框架 我们Q-LLM框架的示意图。来自记忆上下文的输入被分割成记忆块,通过查询感知的上下文查找来搜索与查询相关的块。目前的键值缓存…

怎么改公网IP?

在互联网时代,公网IP地址作为连接互联网的标识,对于个人用户和企业来说具有重要意义。公网IP有时会受到限制、安全性不高等问题,因此需要进行改变。本文将介绍几种常用的方法来改变公网IP。 更改路由器设置 大多数家庭和办公室网络都是通过…

【网络编程开发】17.“自动云同步“项目实践

17."自动云同步"项目实践 文章目录 17."自动云同步"项目实践项目简介功能需求需求分析实现步骤 1.实现TCP通信server.c 服务端tcp.hclient.c 客户端 函数封装tcp.ctcp.hserver.cclient.c编译运行 2.实现文件传输sever.cclient.ctcp.ctcp.hMakeifle编译运行…

LabVIEW常用的加密硬件

LabVIEW在工程和科学领域中广泛应用,其中数据保护和程序安全尤为重要。为了确保数据的安全性和完整性,常用的加密硬件设备包括TPM(可信平台模块)、HSM(硬件安全模块)和专用加密芯片。本文将推荐几款常用的加…

2012-2022年各省新质生产力指数数据(含原始数据+结果)

2012-2022年各省新质生产力指数数据(含原始数据结果) 1、时间:2012-2022年 2、指标:province、year、平均受教育年限、劳动者人力资本结构、高等院校在校学生结构、人均GDP元、在岗职工工资:元、三产从业人员比重、机…

力扣每日一题 6/11 暴力搜索

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 419.甲板上的战舰[中等] 题目: 给你一个大小为 m x n 的矩阵 b…

ADS基础教程21 - 电磁仿真(EM)模型的远场和场可视化

模型的远场和场可视化 一、引言二、操作步骤1.定义参数2.执行远场视图(失败案例)3.重新仿真提取参数 三、总结 一、引言 本文介绍电磁仿真模型的远场和场可视化。 二、操作步骤 1.定义参数 1)在Layout视图,工具栏中点击EM调出…

【数据库编程-SQLite3(二)】API-增删改查基础函数-(含源码)

学习分享 1、sqlite3_exec函数1.1、使用sqlite3_exec进行【查】操作1.1.1、callback函数 1.2、使用sqlite3_exec进行【增、删、改】操作 2、sqlite3_get_table函数2.1、使用sqlite3_get_table函数进行【查】操作 1、sqlite3_exec函数 1.1、使用sqlite3_exec进行【查】操作 由于…

XML Encoding = ‘GBK‘ after STRANS,中文乱码

最近帮同事处理了一个中信银行银企直连接口的一个问题,同事反馈,使用STRANS转换XML后,encoding始终是’utf-16’,就算指定了GBK也不行。尝试了很多办法始终不行,发到银行的数据中,中文始终是乱码。 Debug使用HTML视图…

各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?

2023简直被人工智能相关话题席卷的一年。关于机器学习算法的热度,也再次飙升,网络上一些分享已经比较老了。那么今天借着查询和学习的机会,我也来浅浅分享下目前各种机器学习算法及其应用场景。 为了方便非专业的朋友阅读,我会从算…

环形链表2证明

解法 快慢指针相遇后,其中一个指回头部,然后同步前进 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNod…

Python-json模块

一、相关概念 # 序列号 和反序列号 # 序列号:把内存中的数据类型转成一种特定格式,这种格式(json/pickle)可以用于存储,或者传输给其他平台 import json # 内存中是数据类型 ----> 序列化 ----> 特定格式&…

传输层——TCP

在学习计算机网络的过程中,我们知道OSI七层协议模型,但是在实际开发应 用中我们发现OSI七层协议模型并不适合实施,因为OSI上三层通常都是由开 发人员统一完成的,这三层之间在实现过程中没有一个明确的界限,所以我 们更…