爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

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

      首页 知识中心 数据库 文章详情页

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

      2024-11-07 08:15:30 阅读次数:33

      sql,事务

      📑事务

      事务的基本概念

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

      比如说:1号给2号转账1000000元
      MySQL经典面试题:谈一谈你对事务的理解

      转账的流程大概是这样的

      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,都会记录在日志体系中,后续如果需要回滚,就可以参考之前记录的内容,来进行还原。
          MySQL经典面试题:谈一谈你对事务的理解
      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. 脏读
        MySQL经典面试题:谈一谈你对事务的理解

        • 有两个事务 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 串行化
      此时,所有的事务都是在服务器上一个接一个的执行的
      此时,解决了脏读,不可重复读,幻读问题
      并发程度最低,执行速度最慢,隔离性最高,数据最准确~

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

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

      • 答:根据需要,看是需要执行速度快,还是需要数据比较准,从而选择合适的隔离级别,快和准无法兼得。
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/qrwitu142857/article/details/139518947,作者:月临水,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Mysql--横表纵表

      下一篇:每日一练

      相关文章

      2025-05-14 10:03:13

      【Mybatis】-动态SQL

      【Mybatis】-动态SQL

      2025-05-14 10:03:13
      include , set , sql , SQL , 条件 , 标签
      2025-05-14 10:02:48

      SQL Server 事务日志体系结构1--基本术语

      事务包括对数据库的一次更改或一系列更改。它有一个明确开始和明确结束。开始时使用BEGIN TRANSACTION语句,或者SQL Server会自动为您开始一个事务。

      2025-05-14 10:02:48
      Server , SQL , 事务 , 数据库 , 日志 , 磁盘
      2025-05-13 09:51:29

      oracle 10.2.0.4安装ogg执行ddl_setup.sql时,报警“ORA-20783:RECYCLEBIN must be turned off”

      oracle 10.2.0.4安装ogg执行ddl_setup.sql时,报警“ORA-20783:RECYCLEBIN must be turned off”

      2025-05-13 09:51:29
      ORA , setup , sql
      2025-05-13 09:50:48

      sql*plus中文乱码

      sql*plus中文乱码

      2025-05-13 09:50:48
      sql , 中文 , 乱码
      2025-05-13 09:50:48

      查找正在执行的select以及dml语句的相关信息

      查找正在执行的select以及dml语句的相关信息

      2025-05-13 09:50:48
      select , session , sql , SQL , 语句
      2025-05-13 09:49:12

      JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

      JDBC(Java Database Connectivity)事务是指一系列作为单个逻辑工作单元执行的数据库操作,这些操作要么全部成功——>提交,要么全部失败——>回滚,从而确保数据的一致性和完整性。

      2025-05-13 09:49:12
      MySQL , 事务 , 执行 , 提交 , 操作 , 数据库
      2025-05-07 09:08:54

      springboot系列教程(十二):基于转账案例,演示事务管理操作

      springboot系列教程(十二):基于转账案例,演示事务管理操作

      2025-05-07 09:08:54
      spring , 事务 , 接口 , 管理器 , 配置
      2025-05-06 09:19:12

      Spring多线程事务 能否保证事务的一致性(同时提交、同时回滚)?

      Spring的事务信息是存在ThreadLocal中的Connection, 所以一个线程永远只能有一个事务

      2025-05-06 09:19:12
      Spring , 事务 , 多线程 , 线程
      2025-04-22 09:28:19

      61. Spring事务传播行为实现原理

      61. Spring事务传播行为实现原理

      2025-04-22 09:28:19
      Spring , ThreadLocal , 事务
      2025-04-22 09:27:37

      【Redis】浅析 Redis 事务

      【Redis】浅析 Redis 事务

      2025-04-22 09:27:37
      redis , Redis , 事务 , 命令 , 执行
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5243551

      查看更多

      最新文章

      oracle 10.2.0.4安装ogg执行ddl_setup.sql时,报警“ORA-20783:RECYCLEBIN must be turned off”

      2025-05-13 09:51:29

      查找正在执行的select以及dml语句的相关信息

      2025-05-13 09:50:48

      JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

      2025-05-13 09:49:12

      【Redis】浅析 Redis 事务

      2025-04-22 09:27:37

      如何找到某个 ABAP structure 某字段的源头来自哪个数据库表

      2025-03-26 08:43:34

      oracle用命令执行sql脚本文件

      2025-03-21 09:33:42

      查看更多

      热门文章

      Demo | 神操作,SqlAlchemy用一行命令还原数据库!

      2023-05-06 10:22:26

      pandas to_sql保存数据到数据库后,添加自增长的主键ID(PRIMARY KEY)

      2023-04-19 09:22:23

      SQL数据库查询LIMIT 数据分页

      2023-04-17 10:54:25

      取出一个实体中不为null的属性和属性值

      2022-12-29 09:29:46

      go 通过sql操作mysql

      2024-06-28 06:18:10

      MySQL数据库(17):高级数据操作-删除数据

      2023-02-23 07:57:25

      查看更多

      热门标签

      数据库 mysql 字符串 数据结构 MySQL 算法 redis oracle java sql python 数据 索引 SQL 查询
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Confluence 6 升级自定义的站点和空间获得你的自定义布局

      SQL基础操作_8_基础概念

      SQL2000定时备份到异机

      MySQL数据库分组和聚合函数组合使用

      MySQL数据库10——多表连接查询

      myql-exists子查询外表关联记录

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号