MySQL面试题-事务篇
1.事务的特性(ACID)
事务(Transaction)是指一组操作被看作是一个不可分割的工作单元,这组操作要么全部执行成功,要么全部执行失败。事务的特性通常用 ACID 四个单词来描述,它们分别代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
- 原子性:事务是一个原子操作,它要么全部完成,要么全部不完成,不会出现部分完成的情况。如果在事务执行过程中出现了错误,所有的修改将会被回滚(Rollback)到事务开始前的状态,不会对数据产生影响。
- 一致性:在事务开始和结束时,数据库都必须保持一致性状态。事务开始前和结束后,数据库的完整性约束没有被破坏,所有的数据都应该合法。
- 隔离性:多个事务之间的操作是相互隔离的,每个事务都感觉不到其他事务的存在。隔离级别可以通过设置来控制事务的隔离程度,例如读未提交、读已提交、可重复读和串行化等级别。
- 持久性:事务完成后,对于数据的修改应该永久保存在数据库中,即使系统故障或者断电等异常情况也不应该丢失。
2.事务的隔离级别
事务隔离级别是指多个事务之间的隔离程度,它决定了一个事务在修改数据时对其他事务的影响以及读取数据时能够看到其他事务的哪些修改。
MySQL 支持四种标准的隔离级别,分别是:
-
读未提交(Read Uncommitted):允许脏读,一个事务可以读取到另一个未提交的事务修改的数据,会出现幻读、不可重复读和脏读等问题。
-
读提交(Read Committed):只能读取到已经提交的数据,但是在同一个事务中,多次读取同一数据,可能会得到不同的结果,也会出现幻读问题。
-
可重复读(Repeatable Read):保证了同一个事务中多次读取同一数据结果相同,但是在事务执行过程中,会出现新插入的数据无法读取到的问题,即幻读问题。
-
串行化(Serializable):强制事务串行执行,避免了脏读、不可重复读和幻读问题,但是会大大降低数据库的并发性能。
在实际应用中,应根据业务的特点和数据的一致性需求选择合适的隔离级别。一般情况下,推荐使用可重复读隔离级别。
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ-UNCOMMITTED | √ | √ | √ |
| READ-COMMITTED | × | √ | √ |
| REPEATABLE-READ | × | × | √ |
| SERIALIZABLE | × | × | × |
3.一致性视图(read-view)
InnoDB通过构造一致性视图来实现RC和RR隔离级别。在RC和RR隔离级别下,事务只能看到在启动该事务时已经提交的数据,也就是说只能看到在该事务启动瞬间,对事务的隔离级别所允许的操作已经完成的数据。为了实现这一点,InnoDB使用了一致性视图机制,通过保存当前活跃事务的ID和启动瞬间已提交的事务ID构建一致性视图,然后在查询时使用该视图来确定可见的数据版本。因此,使用一致性视图机制,InnoDB可以提供高效的RC和RR隔离级别实现。
4.事务隔离是如何实现的 ?
在MySQL中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。
5.回滚日志什么时候会被删除?
系统会判断当没有事务需要用到这些回滚日志的时候,回滚日志会被删除。
具体来说,当一个事务提交时,如果当前系统中没有其他事务需要使用该事务的回滚日志,则该事务的回滚日志就可以被删除。如果还有其他事务需要使用该事务的回滚日志,则该回滚日志会被保留,直到所有依赖该回滚日志的事务都提交或者回滚。
6.为什么尽量不要使用长事务?
长事务在数据库中长时间占用锁资源,会导致锁等待和死锁等问题,影响系统的并发性能和稳定性。
具体来说,长事务会对回滚日志和MVCC机制造成影响。在数据库中,每个事务都有一个唯一的事务 ID,每次更新操作都会在回滚日志中记录一条对应的回滚操作,用于在事务回滚时恢复数据的一致性。而长事务会使得回滚日志中的回滚操作不断累积,占用大量磁盘空间。同时,长事务中的事务视图也会一直存在,这会使得数据库中的版本链表越来越长,导致查询时的性能下降。
另外,长事务还会增加数据库的故障恢复成本。当数据库出现故障需要恢复时,如果存在长事务,那么需要将这些长事务中所有的操作都回滚,这会导致恢复时间变长。
因此,尽量不要使用长事务,可以将事务尽早提交或者分成多个较短的事务来完成操作。
7.事务是如何实现的MVCC呢?
事务的实现基于多版本并发控制(MVCC)的机制。在 InnoDB 存储引擎中,每个行都有一个隐藏的字段,用于存储行的创建时间和删除时间,这个字段的名称是 transaction_id。当行被更新或删除时,事务会将一个新的版本写入磁盘,但原来的版本并不会被删除,而是标记为已删除,同时为这个新版本分配一个新的 transaction_id。
在事务开始之前,会为该事务分配一个唯一的事务 ID(transaction_id),同时会记录一个 up_limit_id,表示在当前事务开始之前,已经提交的最大事务 ID。在快照读中,事务会创建一个视图,用于保存当前事务在执行快照读时数据库的状态,这个视图也称为一致性视图(consistent read view)。这个视图是根据当前事务的 transaction_id 和 up_limit_id 计算出来的,它定义了当前事务能够看到哪些行的版本。
在执行快照读时,如果行的 transaction_id 小于等于当前事务的 up_limit_id,那么这行的版本是可见的。否则,这行的版本是不可见的。通过这种机制,InnoDB 实现了快照读。
在当前读中,事务会获取一个共享锁或排它锁来锁定要修改的行,这样其他事务就不能同时修改这行。在当前读时,如果一个行的 transaction_id 大于当前事务的 up_limit_id,那么该行的最新版本需要被读取并加锁,以保证在这个事务内看到的是最新的版本。为了避免幻读,InnoDB 使用了间隙锁(gap lock)来锁定一定范围内的行,从而保证事务内看到的是连续的一段数据。
总之,事务在 InnoDB 中实现了多版本并发控制(MVCC)的机制,通过记录每个行的创建时间和删除时间,以及每个事务的 transaction_id 和 up_limit_id 来实现快照读和当前读。
8.什么是快照读和当前读
快照读(Snapshot Read)是指在读取数据的过程中,不会对数据的修改产生干扰。通常使用MVCC(多版本并发控制)来实现,即读取数据库中某一时刻的快照,而不受其他并发事务的影响。
在InnoDB中,快照读通常使用SELECT语句进行,其实现方式是通过在一致性视图(Consistent Read View)中找到符合条件的数据行版本。而一致性视图是事务启动时创建的,包含了所有已提交的事务和未提交的当前事务。在快照读期间,如果其他事务对数据行进行了修改,那么读取的数据行版本将不会受到影响。
当前读(Current Read)是指在读取数据的过程中,同时对数据进行修改,也就是读取并锁定了数据行,确保其他并发事务无法修改该数据行。当前读通常使用SELECT...FOR UPDATE或SELECT...FOR SHARE语句进行,其中SELECT...FOR UPDATE会对选中的数据行进行加锁,SELECT...FOR SHARE则会对选中的数据行进行共享锁。
当前读与快照读的区别在于当前读会锁定数据行,因此可能会阻塞其他并发事务,而快照读则不会锁定数据行,不会产生阻塞。选择使用哪种读取方式应该根据实际业务需求和数据访问模式来决定。
9.为什么rr能实现可重复读而rc不能
分两种情况
(1)快照读的情况下,rr不能更新事务内的up_limit_id,
而rc每次会把up_limit_id更新为快照读之前最新已提交事务的transaction id,则rc不能可重复读
(2)当前读的情况下,就是读的时候加锁,保证是最新版本,rr是利用record lock+gap lock来实现的,而rc没有gap,所以rc不能可重复读
相关文章:
MySQL面试题-事务篇
1.事务的特性(ACID) 事务(Transaction)是指一组操作被看作是一个不可分割的工作单元,这组操作要么全部执行成功,要么全部执行失败。事务的特性通常用 ACID 四个单词来描述,它们分别代表原子性&…...
Linux嵌入式开发 | 汇编驱动LED(1)
文章目录🚗 🚗Linux嵌入式开发 | 汇编驱动LED(1)🚗 🚗初始化IO🚗 🚗STM32🚗 🚗使能GPIO时钟🚗 🚗设置IO复用🚗 Ƕ…...
什么是EventLoop?怎么测试Node或页面的性能
Event Loop 机制大家应该都有了解。本文利用 EventLoop 去做一个有趣的检测node或页面性能的代码,顺便介绍了一下EventLoop,希望对大家有所帮助! Event Loop Event Loop 机制大家应该都有了解。我先重复总结一下。 Node.js 和 Javascript 的…...
1018 锤子剪刀布 1025 反转链表
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。 输入格式: 输入第 1 行给出正整数 N(≤10 5 ),即双方交锋的次数。随后 N 行,每行给出一次交锋的信…...
卷积神经网络的原理及实现
专栏:神经网络复现目录 卷积神经网络 本章介绍的卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络架构的模型在计算机视觉领域中已经占主导地位,当今…...
【C++知识点】重载
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...
apscheduler三种定时触发方式
#第一种# date: 特定的时间点触发# 2019-01-01 00:00:00 准时执行# import time # from apscheduler.schedulers.blocking import BlockingScheduler # # def my_job(): # print(time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(time.time()))) # sched BlockingSchedu…...
802.11 service服务类型
802.11 serviceservice定义service分类按照模块分为两类按照功能分为六类数据传输相关服务分布式服务DS(Distribution Service)整合服务IS(Integration Service)关联(association)重关联(reasso…...
pytest测试框架——allure报告
文章目录一、allure的介绍二、allure的运行方式三、allure报告的生成方式一、在线报告、会直接打开默认浏览器展示当前报告方式二、静态资源文件报告(带index.html、css、js等文件),需要将报告布置到web服务器上。四、allure中装饰器1、实现给…...
SQLI-Labs(3)8-14关【布尔盲注和时间盲注】
目录 第八关 第九关: 第十关 第十一关 第十二关 第十三关 第十四关 第八关 我们用测试语句来测试是否为注入点 从上图中得知存在注入点,那么接下来就是爆列 一共有三列,接下来用union select 和报错注入都试一下发现没有回显点&…...
ESP32学习笔记03-日志打印
ESP32日志 日志分为5个等级 ESP_LOGE - error (lowest)ESP_LOGW - warningESP_LOGI - infoESP_LOGD - debugESP_LOGV - verbose (highest)API 0.头文件 #include "esp_log.h"1.给一个日志标签设置等级...
mongoTemplate非string类型模糊查询
需求 为方便使用人员对任务Task的搜索,需要根据number实现模糊搜索。 背景 之前设计的number是long类型,但是mongodb只支持string类型的正则匹配。 方案 修改number为string类型;新增一个冗余字段,用于模糊查询;在…...
Redis是单线程还是多线程?Redis的10种数据类型,有哪些应用场景?
目录专栏导读一、同样是缓存,用map不行吗?二、Redis为什么是单线程的?三、Redis真的是单线程的吗?四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…...
到底什么才是幻读?
💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…...
RPC重试机制和控制方案
重试机制 因为网络抖动等原因导致 RPC 调用失败,这时候使用重试机制可以提高请求的最终成功率,减少故障影响,让系统运行更稳定。 重试简易实现方案 在重试的过程中,为了能够在约定的时间内进行安全可靠地重试,在每次…...
【无标题】动态给结构体赋值
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int id; char name[20]; double score; } Student; int main() { Student *p (Student *)malloc(sizeof(Student)); if (p NULL) { printf(“Memory allocation failed.”…...
centos7 soft raid每周自动同步的问题
之前redhat老版本时也遇到过这样的问题https://blog.csdn.net/jolly10/article/details/108768360centos7解决的办法略有不同,记录一下:centos7默认是每周日凌晨1点进行raid检查,有点太频繁了[oracleqht117 data]$ ls /etc/cron*/etc/cron.de…...
嵌入式Linux内核代码风格
这是一个简短的文档,描述了linux内核的首选代码风格。代码风格是因人而异的,而且我 不愿意把我的观点强加给任何人,不过这里所讲述的是我必须要维护的代码所遵守的风格, 并且我也希望绝大多数其他代码也能遵守这个风格。请在写代码…...
Andorid:关于Binder几个面试问题
1.简单介绍下binderbinder是一种进程间通讯的机制进程间通讯需要了解用户空间和内核空间每个进程拥有自己的独立虚拟机,系统为他们分配的地址空间都是互相隔离的。如两个进程需要进行通讯,则需要使用到内核空间做载体,内核空间是所有进程共享…...
【剑指Offer-Java】包含min函数的栈?
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min()…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...
Async-profiler 内存采样机制解析:从原理到实现
引言 在 Java 性能调优的工具箱中,async-profiler 是一款备受青睐的低开销采样分析器。它不仅能分析 CPU 热点,还能精确追踪内存分配情况。本文将深入探讨 async-profiler 实现内存采样的多种机制,结合代码示例解析其工作原理。 为什么需要内…...
【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示
文章目录 前言1. Docker 是什么?2. 为什么要使用 Docker? 安装 Docker1. 安装 Docker Desktop2. 安装 OrbStack3. Docker Desktop VS OrbStack5. 验证安装 使用 Docker 运行项目1. 克隆项目到本地2. 进入项目目录3. 启动容器: 查看运行效果1. OrbStack 中…...
