首页 > 数据库 >MYSQL事务面试题记录

MYSQL事务面试题记录

时间:2024-03-20 22:01:05浏览次数:19  
标签:面试题 隔离 重复 数据库 事务 提交 MYSQL 数据

1.什么是数据库事务

数据库事务是数据库管理系统执行过程种的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要嘛全部执行,要嘛都不执行,是一个不可分割的工作单位。

2.Mysql事务的四大特性是什么?

  • 原子性

事务作为一个整体被执行,对数据库的操作要吗全部被执行,要吗都不执行,要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

原子性的记忆点可以参考化学:原子(atom),是指 化学反应 不可再分的基本 微粒 。 原子在化学反应中不可分割

  • 一致性

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  拿转账来说,假设用户a和用户b两者的钱加起来一共是500,那么不管a和b之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是500,这就是事务的一致性。

  • 隔离性

隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。

  • 持久性

持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。

3.事务的隔离级别(四种)

名词说明

以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思。

脏读

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。

可重复读

可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新(UPDATE)操作。

不可重复读

对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新(UPDATE)操作。

幻读

幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。

注:MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的

Read Uncommitted(读取未提交内容)

MySQL 事务隔离是依靠锁来实现的,加锁自然会带来性能上的损失。而读未提交隔离级别是不加锁的,所以它的性能理论上是最好的,没有加锁和解锁带来的性能开销。这基本上就相当于裸奔啊,所以它连脏读的问题都没办法解决。

任何事务对数据的修改都会第一时间暴露给其他事务,即使事务还没有提交。

例:启动两个事务,分别为事务A和事务B,在事务A中使用 update 语句,修改 age 的值为10,初始是1 ,在执行完 update 语句之后,在事务B中查询 user 表,会看到 age 的值已经是 10 了,这时候事务A还没有提交,而此时事务B有可能拿着已经修改过的 age=10 去进行其他操作了。在事务B进行操作的过程中,很有可能事务A由于某些原因,进行了事务回滚操作,那其实事务B得到的就是脏数据了,拿着脏数据去进行其他的计算,那结果肯定也是有问题的。

Read Committed(读取已提交内容)

读未提交没办法解决脏数据问题,那么就有了读已提交。读已提交就是一个事务只能读到其他事务已经提交过的数据,也就是其他事务调用 commit 命令之后的数据。那脏数据问题迎刃而解了。

读提交事务隔离级别是大多数流行数据库的默认事务隔离界别,比如 Oracle,但是不是 MySQL 的默认隔离界别。

例:

同样开启事务A和事务B两个事务,在事务A中使用 update 语句将 id=1 的记录行 age 字段改为 10。此时,在事务B中使用 select 语句进行查询,我们发现在事务A提交之前,事务B中查询到的记录 age 一直是1,直到事务A提交,此时在事务B中 select 查询,发现 age 的值已经是 10 了。

这就出现了一个问题,在同一事务中(本例中的事务B),事务的不同时刻同样的查询条件,查询出来的记录内容是不一样的,事务A的提交影响了事务B的查询结果,这就是不可重复读,也就是读提交隔离级别。

Repeatable Read(可重复读)MySQL默认事务隔离级别

可重复对比不可重复而言,不可重复读是指同一事物不同时刻读到的数据值可能不一致。而可重复读是指:事务不会读到其他事务对已有数据的修改,即使其他事务已提交,也就是说,事务开始时读到的已有数据是什么,在事务提交前的任意时刻,这些数据的值都是一样的。但是,对于其他事务新插入的数据是可以读到的,这也就引发了幻读的问题。

例:事务A启动后修改了数据,并且在事务B之前提交,事务B在事务开始和事务A提交之后两个时间节点都读取的数据相同。

Serializable(串行化)

串行化是4种事务隔离级别中隔离效果最牛的,解决了脏读、可重复读、幻读的问题,但是效果最次,它将事务的执行变为顺序执行,与其他三个隔离级别相比,它就相当于单线程,后一个事务的执行必须等待前一个事务结束。

串行化实现原理:读的时候加共享锁,也就是其他事务可以并发读,但是不能写。写的时候加排它锁,其他事务不能并发写也不能并发读。

总结

读未提交和串行化基本上是不需要考虑的隔离级别,前者不加锁限制,后者相当于单线程执行,效率太差。

读提交解决了脏读问题,行锁解决了并发更新的问题。并且 MySQL 在可重复读级别解决了幻读问题,是通过行锁和间隙锁的组合 Next-Key 锁实现的。

标签:面试题,隔离,重复,数据库,事务,提交,MYSQL,数据
From: https://blog.csdn.net/weixin_70859569/article/details/136873332

相关文章

  • 史上最全Java核心面试题(带全部答案)2024年最新版
    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次。对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦。在跳槽季来临之前,特地做这个系列的文章,一方面帮助自己巩固下基础,另一方面也希望帮助想要换工......
  • MySQL学习八:窗口函数(一)
    目录一、窗口函数1.窗口函数定义2.窗口函数语法3.演示表格一4.窗口的确定4.1例1:查询各班级总分4.2例2:查询各班级累计总分4.3分区子句(partitionby)4.4排序子句(orderby)4.5窗口子句(rows)4.6总体执行流程5.函数分类5.1排序类函数5.2聚合类函数5.3跨行类函数......
  • 了解和编译安装mysql数据库
    一.数据库的基本概念1.1数据①描述事物的符号记录称为数据(Data)。包括数字、文字、图形、图像、声音、档案记录等②数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的。相同格式和类型的数据统一存放在一起,而不会把“人”和“书”混在一起存储。这样,数......
  • MySQL | CRUD
    目录1.Create2.Retrieve2.1.SELECT列2.1.1.全列查询2.1.2.指定列查询2.1.3.查询字段为表达式2.1.4.为查询结果指定别名2.1.5.结果去重2.2.WHERE条件2.2.1.年龄小于19的同学2.2.2.id在2~3的同学2.2.3.id为1和4的同学2.2.4.姓张的同学及张某的同学2.3......
  • 记一下mysql隔离级别问题
      MSQL默认隔离级别是  可重复读; 可重复读即 同一次查询,再次查询结果一致;不会查询到别的事务提交的内容;原理:开始事务后,做一次select产生一个readview,这个readview已经确定了能读取的undolog链;简单理解就是只能读取到当前事务版本之前的数据;当另一个事务插入数据......
  • MySQL中如何快速定位占用CPU过高的SQL
    作为DBA工作中都会遇到过数据库服务器CPU飙升的场景,我们该如何快速定位问题?又该如何快速找到具体是哪个SQL引发的CPU异常呢?下面我们说两个方法。聊聊MySQL中如何快速定位占用CPU过高的SQL。技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。 以一......
  • 【数据库】MySQL表的增删改查(二)
    文章目录一、数据库约束一、数据库约束1.1约束类型NOTNULL-指示某列不能存储NULL值。UNIQUE-保证某列的每行必须有唯一的值。DEFAULT-规定没有给列赋值时的默认值。PRIMARYKEY-NOTNULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识......
  • kafka面试题 1
    kafka面试题1简介kafka是一个分布式发布-订阅消息系统和一个强大的队列,可以处理大量的数据,并使你能够将消息从一个端点传递到另一个端点,kafka适合离线和在线消息消费,kafka消息保留在磁盘上,并在集群内复制以防止数据丢失,kafka构建在zookeeper同步服务上,他与ApacheStorm......
  • x == (x = y) 与 (x = y) == x 不同?【Java 面试题】
    x==(x=y)与(x=y)==x不同?classQuirky{publicstaticvoidmain(String[]args){intx=1;inty=3;System.out.println(x==(x=y));//falsex=1;//resetSystem.out.println((x=y)==x);//......
  • 常见面试题答案
    目录1.介绍一下volatile关键字2.C++中的内联函数和宏的区别在于:3.自己实现一个堆栈C++实现+模板4.函数后面加const的作用是什么?5.纯虚函数和虚函数的区别?1.介绍一下volatile关键字volatile是一个类型修饰符,用于告诉编译器对象的值可能会在编译器无法检测到的情况下被......