MySQL大厂面试题之——事务篇

1、了解事务吗,MySQL中事务的隔离级别有哪些?

  • 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读已提交:一个事务提交之后,它做的变更才能被其他事务看到。
  • 可重复读:一个事务执行过程中看到的数据,总是和这个事务启动时看到的数据是一致的。
  • 串行化:对于同一条记录,写会加写锁,读也会加读锁,当出现读写锁冲突时,后访问的事务必须等前一个事务执行完成,才能继续执行。

针对不同的隔离级别,并行事务下可能出现的问题会不一样。

  • 读未提交:可能会发生脏读、不可重复读和幻读现象。
  • 读提交:可能会发生脏读和不可重复度。
  • 可重复读:可能会发生幻读现象。
  • 串行化:这些现象都不会发生。

2、MySQL中默认的隔离级别是什么?你们在生产环境中一般使用什么隔离级别,为什么?

MySQL中默认的隔离级别是:可重复读。
主要有一些历史的原因,主从复制是基于bin log进行复制的,在bin log中存在三种格式:

  • statement:记录修改SQL语句
  • row:记录每行实际数据的变更
  • mixed:statement和row模式的混合

在MySQL5.0之前,binlog只支持statement这种格式,而在读提交这个隔离级别下主从复制存在bug,因此才使用可重复读作为默认的隔离级别。

一般公司中使用的隔离级别是:读提交。
主要是为了提高并发和降低死锁的概率。为了解决幻读的问题,可重复读读提交多了间隙锁(gap lock)和临键锁(next-key lock)。在读提交中修改数据仅使用行锁,锁定的范围更小,在高并发的情况下相对性能更好一点。并且在读提交的隔离级别相下发生死锁的几率会比可重复读的隔离级别下低很多。

3、MySQL中是如何实现事务的?

MySQL 主要是通过:锁、Redo Log 、Undo Log、MVCC 来实现事务。
MySQL 利用锁(行锁、间隙锁等等)机制,使用数据并发修改的控制,满足事务的隔离性。

  • redo log:InnoDB在执行事务的过程中,将事务的修改操作都会记录在redo log中,用于保证事务的持久性。在redo log中主要记录事务对数据的修改(行、列以及修改前后的值),在事务提交时,会将redo log写入磁盘,保证数据持久性。
  • undo log:回滚日志,它会记录事务的反向操作,简单地说就是保存数据的历史版本,用于事务的回滚。
  • MVCC:InnoDB实现了多版本并发控制(MVCC)用于支持事务的隔离性。在每个版本中通过事务id(row trx_id)表示该版本的生命周期,在事务执行过程中,根据当前事务的隔离级别来确定可见的数据版本,保证事务之间的隔离。
  • 锁:InnoDB通过共享锁和排它锁保证数据的一致性和隔离性。共享锁用于读操作,多个事务可以同时持有;排他锁用于写操作,在同一时间只有一个事务持有。在事务执行过程中根据需要自动加锁和解锁,保证数据的一致性和隔离性。

在InnoDB中,一旦事务被提交,就会将修改操作写入磁盘,并且释放所有的锁。如果事务发生异常或者被回滚,将回滚修改的数据,并释放所有的锁。

4、MySQL中长事务可能会导致哪些问题?

1、长时间持有锁:
长事务会持有数据库锁很长时间,可能导致其他事务无法访问被锁锁定的数据,严重时会导致锁竞争死锁。这会导致其他事务的操作被阻塞,降低系统的并发性能、以及数据库的吞吐量。

2、增加死锁风险:
长事务在执行过程中,可能涉及多个数据的锁定,高并发下可能互相等待,形成死锁。这也就导致事务无法完成,需要回滚,死锁的检查和处理不仅消耗额外的资源还难以预测。回滚过程需要撤销大量数据修改,可能会导致撤销日志的写入和磁盘I/O操作急剧增加。

3、数据一致性的问题:
在事务执行期间,如果其他事务修改了相同数据,长事务的提交可能会导致数据冲突或丢失。

4、内存使用过高:
长事务会占用更多的内存,需要保留大量的撤销日志和未提交的数据。MySQL消耗大大增加,可能导致操作系统内存回收机制频繁触发,影响整体性能。

5、导致主从延迟:
在主从复制的环境中,长事务可能会导致主从复制的延迟,服务器需要等待主服务器上的长事务完成才能进行数据同步。

6、导致InnoDB表空间碎片:
长事务在批量数据修改的过程中,InnoDB会在更新时发生页拆分页合并,导致磁盘空间碎片化,降低磁盘I/O性能,还会增加不必要的存储开销,增加维护成本。

在项目开发过程中,应尽量避免长事务,合理设计事务、控制事务执行时间和分批提交等方式减少长事务带来的负面影响。

5、MySQL事务的二阶段提交了解吗?

二阶段提交(2PC)是分布式事务中一种协调协议,用于确保多个资源在事务提交时保持一致性。MySQL在存储引擎和Binlog之间使用二阶段提交来保证事务的一致性。
二阶段提交的流程:

1、准备阶段

  • MySQL将事务的修改写入redo log,将redo log标记为prepare状态
  • 此时,数据实际修改还未提交,事务处于“可恢复”状态(可以通过redo log恢复未完成的事务)
  • 如果发生异常,可以回滚

2、提交阶段

  • MySQL将事务写入binlog(记录事务的持久性变更,用于主从复制)
  • 确保binlog写入成功,更新redo log的状态为committed
  • 事务正式提交,数据对其他事务可见

二阶段提交的作用:

  • 保证一致性:确保InnoDB的事务日志和binlog之间的一致性。如果binlog写入失败,可以通过回滚撤销未完成的事务
  • 主从复制的一致性:binlog用于主从复制。如果没有二阶段提交,可能会导致主库和从库数据不一致。
  • 崩溃恢复:如果在事务提交中途崩溃,redo log的prepared 状态可以帮助事务在恢复时判断是提交还是回滚。

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

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

相关文章

计算机网络——数据链路层-流量控制和可靠传输

一、流量控制 流量控制是指由接收方及时控制发送方发送数据的速率,使接收方来得及接受。 • 停止等待流量控制 • 滑动窗口流量控制 1、停止—等待流量控制 停止-等待流量控制的基本原理是发送方每发出一帧后,就要等待接收方的应答信号&#xff…

GPT系统重大升级,开创国内先河:o1支持图片识别功能正式上线

文章目录 零、前言一、授权码登录体验优化:一步直达聊天界面二、全新“项目”功能:让工作更有条理三、语音功能升级:全新交互体验四、o1支持图片识别五、总结 零、前言 我是虚竹哥,目标是带十万人玩转ChatGPT。 亲爱的用户&…

RabbitMQ-基本使用

RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…

弹性云服务器ECS“规格”

规格详细资料:规格清单(x86)_弹性云服务器 ECS_华为云 通用计算型 各规格详细介绍请参见通用计算型。 规格名称 计算 磁盘类型 网络 通用计算型X1 CPU/内存配比:自定义vCPU数量范围:1-16处理器:第三…

Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》 1. Apache POI 简介 Apache POI 是一个强大的 Java 库,用于处理 Microsoft Office 文档,包括 Excel 文件(.xls 和 .xlsx)。在 Java Spring Boot 项目中&am…

在 macOS 中,设置自动将文件夹排在最前

文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

Sentinel-5P遥感数据下载及预处理教程【20250105】

Sentinel-5P是欧空局(Europe Space Agency,ESA)于2017年10月13日发射的一颗全球大气污染监测卫星。卫星搭载了对流层观测仪(Tropospheric Monitoring Instrument,TROPOMI),可以有效的观测全球各…

java项目之高校心理教育辅导系统的设计与实现(springboot+mybatis+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 高校心理教育辅导系统的设…

打造三甲医院人工智能矩阵新引擎(一):文本大模型篇--基于GPT-4o的探索

一、引言 当今时代,人工智能技术正以前所未有的速度蓬勃发展,深刻且广泛地渗透至各个领域,医疗行业更是这场变革的前沿阵地。在人口老龄化加剧、慢性疾病患病率上升以及人们对健康需求日益增长的大背景下,三甲医院作为医疗体系的核心力量,承担着极为繁重且复杂的医疗任务。…

美的空气净化器好用吗?拾梧、美的、戴森空气净化器除烟哪个好?

说到二手烟,这可真是个让人头疼的问题!它里面含有超过7000种化学物质,形式多样,处理起来比甲醛这些传统污染物难多了。在市场上那么多空气净化器里,要挑一个能真正对付二手烟的,简直就像大海捞针一样难。不…

WebRtc01:课程导学、框架介绍

应用 难点 课程大纲 学习收获 涉及内容 概述 用途 学习收获

电脑steam api dll缺失了怎么办?

电脑故障解析与自救指南:Steam API DLL缺失问题的全面解析 在软件开发与电脑维护的广阔天地里,我们时常会遇到各种各样的系统报错与文件问题,其中“Steam API DLL缺失”便是让不少游戏爱好者和游戏开发者头疼的难题之一。作为一名深耕软件开…

关系数据库查询与优化

关系数据库查询与优化 (1)查询所有没发表过文章的用户名(2)查询得票数大于100的所有文章标题,按得票数倒序排列(3)查询发表文章数大于5,文章平均得票数大于100的用户名,按平均得票数倒序排列(4)表的主键、外键和索引设计(5)大数据量下的存储及性能优化在关系数据库…

【Android项目学习】3. MVVMHabit

项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础,整合OkhttpRxJavaRetrofitGlide等流行…

GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程

大家好,今天给大家介绍一下:GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…

学习虚幻C++开发日志——创建Selection Widget及其应用

教程视频:脚本冒险 - YouTube 前提:此代码运用到Common UI插件,需将其开启,以免后序编写产生未定义结构体的报错信息! 用C进行UI绑定 创建继承于CommonUserWidget的类,此处命名为SelectionBase Select…

Kafka中的Topic和Partition有什么关系?

大家好,我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系?】面试题。希望对大家有帮助; Kafka中的Topic和Partition有什么关系? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…

SpringBoot Maven 项目 pom 中的 plugin 插件用法整理

把 SpringBoot Maven 项目打包成 jar 文件时,我们通常用到 spring-boot-maven-plugin 插件。 前面也介绍过,在 spring-boot-starter-parent POM 和 spring-boot-starter POM 中都有插件的管理,现在我们就撸一把构建元素中插件的用法。 一、…

c和c++中为什么要防止头文件被重复包含!

在编程中,头文件就像一本工具书,它包含了函数、类、宏、全局变量等的定义和声明,供其他代码文件引用。想象一下,如果你在写一篇文章时,反复引用同一本工具书的内容,会发生什么情况呢? 1. 避免重…