MySQL面试题——隔离级别相关面试题

2023-09-13 21:01:00

隔离级别相关面试题

MySQL事务隔离级别

  1. 未提交读——可以读到其他事务未提交的数据(最新的版本)
    • 错误现象:脏读、不可重复读、幻读的现象
  2. 提交读(RC)——可以读到其他事务已提交的数据(最新已提交的版本)
    • 错误现象:不可重复读、幻读现象
    • 使用场景:希望看到最新的有效值
  3. 可重复读(RR)——在事务范围内,多次读能够保证一致性(快照建立时最新已提交版本)
    • 错误现象:幻读现象,可以加锁避免
    • 使用场景:事务内要求更强的一致性,但看到的未必是最新的有效值
  4. 串行读——在事务范围内,仅有读读可以并发,读写或写写会阻塞其他事务,用这种办法可以保证更强的一致性
    • 错误现象:无
脏读

脏读现象

事务1将隔离级别设置成 未提交读,事务2隔离级别为任意级别;
事务1开启事务,查询账户信息,查到id为1的账号余额为1000,id为2的余额为1000;
事务2开启事务,将id为1的账户余额修改为2000;
事务1再次查询账户信息,发现与之前查询的不一致了(此时事务2还未结束)。
上述便是脏读现象。

不可重复读

不可重复读

事务1将隔离级别设置成 提交读,事务2没有显示的开启事务,关闭事务;
事务1开启事务,查询账户信息,查到id为1的账号余额为1000,id为2的余额为1000;
事务2将id为1的账户余额修改为2000,因为没有显示开启事务,所以这条sql语句就是一个事务,事务2已经提交;
事务1再次查询账户信息,发现与之前查询的不一致了。
上述便是不可重复读现象。

幻读

幻读

事务1将隔离级别设置成可重复读,事务2没有显示的开启事务,关闭事务;
事务1开启事务,查询账户信息,查到id为1的账号余额为1000,id为2的余额为1000;
事务2插入一条id为3,余额为1000的数据,因为没有显示开启事务,所以这条sql语句就是一个事务,事务2已经提交;
事务1再次插入id为3,余额为5000的数据,发现id为3的数据已经存在了,报了主键重复。
上述便是幻读现象。

加锁避免幻读

加锁避免幻读

因为事务1要添加id为3的数据,可以给不存在的这条数据查询时加一把锁,事务2添加时就会阻塞。

串行读隔离级别避免幻读

使用串行读隔离级别避免幻读

快照读与当前读

当前读

读取最新提交的数据

  • select … for update
  • select … lock in share mode
  • insert、update、delete,都会按最新提交的数据进行操作

当前读本质上是基于锁的并发读操作。

快照读

读取某一个快照建立时(可以理解为某一时间点)的数据,也称为一致性读。

快照读主要体现在 select (不带for update)的语句执行时;不同隔离级别下,select 的行为不同。

  • 在 Serializable 隔离级别下 —— 普通 select 的sql语句也会变成当前读,即加共享读锁;

  • 在 RC 隔离级别下 - 每次 select 都会建立新的快照;

  • 在 RR 隔离级别下

    • 事务启动后,首次 select 会建立快照
    • 如果事务启动选择了 with consistent snapshot,事务启动时就建立快照
    • 基于旧数据的修改操作,会重新建立快照

快照读本质上读取的是历史数据(原理是回滚段),属于无锁查询。

RR下,快照建立时机——第一次select时

RR下,快照建立时机——第一次select时图1

事务1在第一次查询时建立快照;事务2虽然修改了id为1数据,但是RR下是基于快照读,是读到的快照建立时的数据;

RR下,快照建立时机——第一次select时图2

如果快照建立比update完会怎样呢?

事务2先提交了update,事务1select时建立快照,就会读到事务2修改的数据。

RR下,快照建立时机——事务启动时

RR下,快照建立时机——事务启动时

如果想要事务启动时建立快照,需要添加with consistent snapshot;

虽然表面上事务2比事务1的select先执行,但是事务1开启事务并建立快照先开始,读到的是未修改的数据;

RR下,快照建立时机——基于旧数据修改数据时

RR下,快照建立时机——基于旧数据修改数据时

事务2基于旧数据修改了数据,会重新建立快照,事务1再更新,会基于2000进行修改。

更多推荐

Flutter快速入门学习(一)

目录前言新建项目项目入口Dart的入口(项目的入口)布局视图组件Container(容器)Text(文本)Image(图片)Row(水平布局)和Column(垂直布局)ListView(列表视图)GridView(网格视图)Stack(层叠布局)Card(卡片)AppBar(应用栏)FloatingActionButt

Docker基本操作

目录Docker基本操作镜像操作拉取、查看镜像保存、导入镜像容器操作创建并运行一个容器进入容器,修改文件数据卷给nginx挂载数据卷给MySQL挂载本地目录Docker基本操作镜像操作拉取、查看镜像需求:从DockerHub中拉取一个nginx镜像并查看1)首先去镜像仓库搜索nginx镜像,比如DockerHub:2)

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1.涉及平台平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务)2.核心架构SpringCloud、SpringBoot、Mybatis、Redis3.前端框架VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程

MySQL的索引概述

目录一、索引的描述二、如何在一个数据表中创建和删除索引呢?三、索引的"两面性"四、索引的适用场景一、索引的描述索引是数据库中一种用于提高数据检索速度和加快查询操作的数据结构。它类似于书籍的目录,可以快速定位到包含特定关键字或值的记录。索引的主要作用是加速数据库的数据检索过程,特别是在大型数据集和复杂查询的情况下。二、如

【QT】day5

1.登录注册和数据库联动三个头文件#ifndefDEMO_H#defineDEMO_H#include<QWidget>#include<QSqlDatabase>//数据库管理类#include<QSqlQuery>//执行sql语句的类#include<QSqlRecord>//数据库记录的类#include<QM

Java + Selenium + Appium自动化测试

一、启动测试机或者Android模拟器(Genymotion俗称世界上最快的模拟器,可自行百度安装)二、启动Appium(Appium环境安装可自行百度)三、安装应用到Genymotion上,如下图我安装一个计算机的小应用,包名为CalcTest.apk安装步骤:(基于AndroidSDK已经配置好了环境变量,可自行百

Failed to connect to bitbucket.org port 443 错误原因, 解决办法

最近使用SourceTree来访问bitbucket.org的代码托管Git,当Pull或者Push发现操作失败:Failedtoconnecttobitbucket.orgport443错误原因:无法链接到网站地址,可能是DNS解析IP地址错误,或者网站维护,大概率是被墙或者DNS解析错误.解决办法:如果您的浏览器能

文件外发流程如何设置,才能进行事前事中事后管控呢?

随着信息技术的快速发展,企业内部数据的安全性成为业务运行过程中的关键问题之一。尤其是对于那些包含商业秘密、客户数据以及机密文件等敏感信息的企业而言,文件的外发往往会导致严重的商业损失和声誉损害。根据IBM的数据报告,2022年全球数据泄露的平均成本创历史新高。2022年,全球数据泄露的平均总成本增加了11万美元,达到4

每天几道Java面试题:IO流(第五天)

目录第五幕、第一场)街边友情提醒背面试题很枯燥,加入一些戏剧场景故事人物来加深记忆。PS:点击文章目录可直接跳转到文章指定位置。第五幕、第一场)街边【衣衫褴褛老者,保洁阿姨,面试者老王】衣衫褴褛老者:“可怜身上诺基亚,心忧JavaOffer少”老王:这位老人家有故事,“老人家,1.Java中有几种类型的流?JDK为每种

OpenCV自学笔记十四:Canny边缘检测

Canny边缘检测是一种经典的图像边缘检测算法,具有以下几个步骤:1.噪声抑制:首先对图像进行平滑处理,以去除图像中的噪声。常用的方法是应用高斯滤波器。2.计算梯度:通过对平滑后的图像应用Sobel算子(或其他梯度算子),计算图像的梯度幅值和梯度方向。梯度表示了图像灰度变化的强度和方向。3.非极大值抑制:根据梯度方向,

Redis——其他数据类型介绍

概要介绍Redis中有10种不同的数据类型。之前的blog中介绍了Redis中常见的五大数据类型:String,List,Hash,Set,ZSet。而Redis中还有许多其他的数据类型,一般在特定的场景中使用Stream首先介绍一下什么是事件,例如JS中的点击button,键盘输入等等都是事件,后端一直等待前端返回数

热文推荐