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

mysql,面试题,隔离,级别,相关 · 浏览次数 : 175

小编点评

##隔离级别相关面试题 **1. 如何理解隔离级别?** 隔离级别是指在多个事务中如何确保每个事务看到的最新数据版本。 **2. 在什么情况下可以设置隔离级别为未提交读?** 当需要保证多个事务之间的数据隔离时,可以设置隔离级别为未提交读。 **3. 在什么情况下可以设置隔离级别为提交读?** 当需要保证多个事务之间的数据隔离时,可以设置隔离级别为提交读。 **4. 脏读、不可重复读、幻读的区别是什么?** * **脏读:**在读取数据之前,其他事务已经修改了该数据。 * **不可重复读:**在读取数据之前,其他事务已经执行了相同的读操作。 * **幻读:**在读取数据之前,其他事务已经执行了相同的写操作,但由于读操作在事务范围内,可以读取到该数据的最新版本。 **5. 如何避免脏读?** * 加锁避免脏读:在读操作之前加锁,直到写操作结束。 * 快照读隔离级别避免脏读:快照读只读取最近提交的数据,不会读取旧数据。 **6. 如何避免不可重复读?** * 设置隔离级别为提交读。 * 使用事务隔离级别。 **7. 如何避免幻读?** * 设置隔离级别为可重复读。 * 使用串行读隔离级别。 **8. 如何理解快照读?** 快照读是指在读取数据之前,其他事务已经执行了相同的写操作,但由于读操作在事务范围内,可以读取到该数据的最新版本。

正文

隔离级别相关面试题

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进行修改。

与MySQL面试题——隔离级别相关面试题相似的内容:

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

隔离级别相关面试题 MySQL事务隔离级别 未提交读——可以读到其他事务未提交的数据(最新的版本) 错误现象:脏读、不可重复读、幻读的现象 提交读(RC)——可以读到其他事务已提交的数据(最新已提交的版本) 错误现象:不可重复读、幻读现象 使用场景:希望看到最新的有效值 可重复读(RR)——在事务范

MySQL面试题全解析:准备面试所需的关键知识点和实战经验

本次种子题目主要涵盖了MySQL的存储引擎和索引结构,如B+树索引和哈希索引,以及覆盖索引和回表的概念。此外,还包含了MySQL事务的ACID特性和隔离级别。另外,对MySQL主从集群中的binlog日志的执行顺序和作用进行了讨论。最后,还涉及了分库分表和读写分离的概念。这些内容涵盖了MySQL数据库的核心知识和重要技术,不仅在面试中起到关键作用还对于优化数据库性能和应用开发都具有重要意义。

MySQL面试必备三之事务

本文首发于公众号:Hunter后端 原文链接:MySQL面试必备三之事务 这一篇笔记介绍一下 MySQL 的事务,面试中常被问到关于事务的几个问题如下: 事务是什么 为什么需要事务,事务有什么作用 事务的特点 事务可能带来哪些问题 事务有哪些隔离级别,这些隔离级别都可以解决哪些问题 可重复读隔离级别

[转帖]Java连接 MySQL详细教程,分享复习经验和后台开发面经

(由于安装了汉化包,英文版的用户可以对应图标来操作) 选中菜单栏文件,之后选择项目结构 选择Libraries 点击+ ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210321181721553.png?x-oss- 【一线大厂Java面试题解析+后端开发学

MySQL面试必备二之binlog日志

本文首发于公众号:Hunter后端 原文链接:MySQL面试必备二之binlog日志 关于 binlog,常被问到几个面试问题如下: binlog 是什么 binlog 都记录什么数据 binlog 都有哪些类型,都有什么特点 如何使用 binlog 恢复数据 binlog 都有哪些作用 binlo

字节面试:MySQL自增ID用完会怎样?

在一些中小型项目开发中,我们通常会使用自增 ID 来作为主键的生成策略,但随着时间的推移,数据库的信息也会越来越多,尤其是使用自增 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的情况,那么如果发生了这种情况,MySQL 又会怎样执行呢? PS:当然,在分库分表的场景中,我们通常会

面试必问:MySQL死锁 是什么,如何解决?(史上最全)

MySQL死锁接触少,但面试又经常被问到怎么办? 最近有小伙伴在面试的时候,被问了MySQL死锁,如何解决? 虽然也回答出来了,但是不够全面体系化, 所以,小北给大家做一下系统化、体系化的梳理,帮助大家在面试过程中能够脱颖而出,拿到自己心仪的Offer 插播一条:如果你近期准备面试跳槽,建议在htt

[转帖]MySQL优化的5个维度

面试官如果问你:你会从哪些维度进行MySQL性能优化?你会怎么回答?所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知道查询操作要经过哪些环节,然后思考可以在哪些环节进行优化。我之前写过一条SQL查询语句是如何执行的?,感兴趣的朋友可以阅读一下,我用其中的一张图展示查询

为什么MySQL单表不能超过2000万行?

摘要:MySQL一张表最多能存多少数据? 本文分享自华为云社区《为什么MySQL单表不能超过2000万行?》,作者: GaussDB 数据库 。 最近看到一篇《我说MySQL每张表最好不要超过2000万数据,面试官让我回去等通知》的文章,非常有趣。 文中提到,他朋友在面试的过程中说,自己的工作就是把

mini-centos7 环境安装部署,各种踩坑。。。

最小Linux系统,安装Java环境 想想就生气,去面试个运维,面试官让我上机装个centos7,还是个最小安装包连界面都没有,只有命令行模式,我都哭了,然后让把一些环境装一下,然后再部署个springboot项目,我他妈都多久没用没有界面的东西了,最后卡在安装MySQL上,真想扇自己个