隔离级别相关面试题

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时

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

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

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

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

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

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

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

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

MySQL面试题——隔离级别相关面试题的更多相关文章

  1. [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. MySQL事务及隔离级别详解

    MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...

  3. MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别

    原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...

  4. 一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...

  5. MySQL事务学习-->隔离级别

    MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...

  6. MySQL之事务隔离级别--转载

    转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...

  7. MySql事务及隔离级别

    在数据库中,所谓事务是指作为单个逻辑工作单元执行的一系列操作. 事务的操作: 先定义开始一个事务,然后对数据作修改操作, 这时如果提交(COMMIT),这些修改就永久地保存下来 如果回退(ROLLBA ...

  8. Mysql数据库的隔离级别

    Mysql数据库的隔离级别有四种 1.read umcommitted   读未提交(当前事务可以读取其他事务没提交的数据,会读取到脏数据) 2.read committed 读已提交(当前事务不能读 ...

  9. 重新学习MySQL数据库8:MySQL的事务隔离级别实战

    重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...

  10. mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理

    一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...

随机推荐

  1. Win10环境配置(二) ——Java篇

    Win10环境配置(二) --Java篇 1.工具准备 官网下载地址:[jdk-11.0.11](Java SE Development Kit 11- - Downloads (oracle.com ...

  2. 自然语言处理 Paddle NLP - 预训练语言模型及应用

    什么是语言理解? 关于疫情的一段对话: 中国:我们这边快完了 欧洲:我们这边快完了 中国:我们好多了 欧洲:我们好多了 挑战: 语言的复杂性和多样性 多义/同义/歧义现象 灵活多变的表达形式 语言背后 ...

  3. js修改css样式

    修改宽度: document.getElementById("div1").style.width="200px"; 修改border-radius: docu ...

  4. 浅谈OpenCV的多对象匹配图像的实现,以及如何匹配透明控件,不规则图像

    浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件 引子 OpenCV提供的templateMatch只负责将(相关性等)计算出来,并不会直接提供目标的对应坐标,一般来说我们直接遍历最 ...

  5. AI室内设计:提升效率、消除沟通障碍,满足客户需求

    前言 免费AI绘图工具:https://www.topgpt.one 随着人工智能(AI)技术的不断发展,室内设计行业也开始受益于这一技术的应用.其中,AI绘画工具在室内设计中的应用正日益受到关注.这 ...

  6. 【SpringBoot】注解

    Controller - @RestController - @RequestMapping("/path") Controller内方法 @GetMapping("/p ...

  7. 抽象语法树AST必知必会

    1 介绍 AST 打开前端项目中的 package.json,会发现众多工具已经占据了我们开发日常的各个角落,例如 JavaScript 转译.CSS 预处理.代码压缩.ESLint.Prettier ...

  8. Vue-treeselect 实现下拉树懒加载,末节点不要箭头

    项目需要,可选择的下拉树,由于数据过多,显示要有层级感,所以使用了懒加载模式 vue-treeselect官网:https://www.vue-treeselect.cn/ 1.前端代码 1.下载依赖 ...

  9. C语言链表实现(郝斌数链表学习笔记)

    #include "stdafx.h" #include<stdio.h> #include<stdlib.h> typedef struct Node { ...

  10. Django message组件

    使用message组件要在seetings中配置 ①INSTALLED_APPS   (项目需要什么功能都放在这 既可以有数据库,又可以写代码,html文件,和自己写的APP一个道理) ②MIDDLE ...