当前位置: 首页 > news >正文

经典面试题:什么是事物的隔离级别?什么是MVCC?

目录

    • 前言
    • 一、事物的隔离级别
    • 二、隔离级别是如何实现的
      • 1. 锁定技术
      • 2. 多版本并发控制(MVCC)
        • 基本原理
        • 实现机制
        • 优缺点
      • 3. 乐观锁与悲观锁
    • 三、MySQL设置隔离级别
      • MySQL数据库
      • Java (使用JDBC)

前言

事务的四大特性(ACID特性),即原子性、一致性、隔离性和持久性。“隔离性”确保了在并发环境中,事物的安全可靠。事物的隔离级别对与数据库来说至关重要,而MVCC是实现事物隔离性的重要技术,值得我们探讨一下。

一、事物的隔离级别

数据库事务的隔离级别定义了在多事务并发环境中,一个事务对数据进行读取或修改时,与其他事务的隔离程度。这主要是为了处理并发控制中可能出现的问题,如脏读、不可重复读和幻读。根据ACID(原子性、一致性、隔离性、持久性)原则中的隔离性要求,SQL标准定义了以下四种主要的事务隔离级别:

  1. 读未提交(Read Uncommitted)

    • 这是最低的隔离级别,允许一个事务读取另一个事务尚未提交的数据(脏读)。
    • 优点:并发度最高。
    • 缺点:可能导致脏读、不可重复读和幻读问题。
  2. 读已提交(Read Committed)

    • 事务只能读取已经提交的数据,避免了脏读问题。
    • 优点:可以防止脏读。
    • 缺点:仍可能出现不可重复读和幻读问题。
  3. 可重复读(Repeatable Read)

    • 保证了在一个事务中多次读取同一数据的结果是一致的,即在事务开始后,不会看到其他事务对该数据的修改。
    • MySQL的InnoDB存储引擎默认采用此隔离级别,并通过Next-Key Locks机制尽量避免幻读的发生。
    • 优点:避免了脏读和不可重复读。
    • 缺点:在某些数据库中(如标准的SQL定义),仍可能遇到幻读问题。
  4. 串行化(Serializable)

    • 最高的隔离级别,通过完全的顺序执行事务或者加锁来防止所有并发问题,确保事务之间完全隔离。
    • 优点:能避免脏读、不可重复读和幻读。
    • 缺点:并发度最低,因为事务是串行执行的,可能导致严重的性能下降。

选择合适的隔离级别需要权衡并发性能与数据一致性之间的关系。在实际应用中,可根据业务需求和数据库特性来决定使用哪种隔离级别。例如,对于金融交易系统,可能倾向于选择较高的隔离级别以确保数据的绝对一致性,即使牺牲一定的并发性能。而在读多写少的场景下,可重复读或读已提交可能是更合适的选择。

二、隔离级别是如何实现的

实现事务的隔离级别主要依靠数据库管理系统(DBMS)内部的机制,这些机制确保了在多事务并发环境中数据的正确性和一致性。不同的隔离级别通过不同的策略来控制并发访问,具体实现方式包括但不限于锁定技术、多版本并发控制(MVCC)、乐观锁和悲观锁等。

1. 锁定技术

  • 读未提交(Read Uncommitted):很少直接使用锁来实现,因为这种级别允许脏读,通常不是通过锁定而是依靠数据的自然状态。
  • 读已提交(Read Committed):可以通过短时的行级锁来实现,读取数据前锁定,读取后立即释放。这样可以确保读到的都是已提交的数据。
  • 可重复读(Repeatable Read):通常使用行级锁加上意向锁(如MySQL的Next-Key Locks)来实现,锁定读取的行以及可能插入的新行范围,防止其他事务修改或插入影响当前事务的可重复读。
  • 串行化(Serializable):最严格的隔离级别,可以通过在整个事务期间持有读取到的所有行上的共享锁,以及在更新时持有的排他锁来实现,这几乎等同于串行执行事务。

2. 多版本并发控制(MVCC)

MVCC(多版本并发控制,Multiversion Concurrency Control)是一种数据库管理系统中用于管理并发事务的技术,旨在提高并发性能并维持事务的隔离性。

基本原理

MVCC的核心思想是在数据库中保存数据的多个版本,使得不同事务可以读取到符合其隔离级别的数据版本,而无需对数据加锁。当事务进行读操作时,看到的并不是数据的实时状态,而是该事务开始时刻数据库的一个快照视图。这样,读事务与写事务之间可以并行执行,大大提高了系统的并发能力。

实现机制
  1. 数据版本管理:每条记录除了实际数据外,还会有额外的元数据记录事务的版本信息,如事务ID或时间戳。

  2. Undo Log(回滚日志):MVCC通常依赖Undo Log来实现数据的多版本。当一个事务更新一条记录时,原始数据不会被直接修改或删除,而是将新值写入,并在Undo Log中记录旧值及其相关信息。这样,通过Undo Log可以还原出数据的任何历史版本。

  3. Read View(读视图):在可重复读(Repeatable Read)隔离级别下,事务开始时会创建一个读视图,记录当前活跃的事务ID列表。当事务进行读操作时,根据读视图判断哪些版本的数据对当前事务可见。

  4. 事务隔离级别实现

    • 读未提交(Read Uncommitted):直接读取最新的数据,忽略MVCC机制。
    • 读已提交(Read Committed):每次查询都生成一个新的读视图,只看到已提交的事务产生的数据版本。
    • 可重复读(Repeatable Read):事务开始时创建一个固定的读视图,整个事务期间看到的数据版本不变。
    • 串行化(Serializable):虽然理论上可以通过MVCC实现,但实际上大多数数据库会通过其他机制(如锁)来实现严格的串行化。
优缺点

优点

  • 高并发:通过避免读写锁的冲突,提高了数据库的并发处理能力。
  • 事务隔离性:有效解决了脏读、不可重复读等问题,根据隔离级别提供不同程度的数据一致性保障。
  • 无锁读:读操作无需等待写锁,减少锁竞争,提高读性能。

缺点

  • 存储和管理开销:需要额外的空间来存储数据的多个版本和Undo Log,管理这些版本也会增加系统复杂度。
  • 性能影响:在高并发写入场景下,Undo Log的增长速度可能会对性能造成影响。
  • 数据清理:需要定期清理不再需要的旧版本数据,否则会导致空间占用过大。

3. 乐观锁与悲观锁

  • 乐观锁:适用于并发写相对较少的场景,事务在更新数据前假设不会有冲突,仅在提交时检查数据是否被其他事务修改过,如有冲突则回滚重试。乐观锁可以通过版本号或时间戳字段实现。
  • 悲观锁:假定会发生并发冲突,因此在事务开始时就锁定资源,阻止其他事务访问,直到当前事务结束。悲观锁通常用于隔离级别较高的场景,通过显式锁定机制实现。

实现事务隔离级别通常需要数据库管理系统提供相应的机制,并且可以通过编程接口来选择和配置这些隔离级别,以满足不同应用场景对数据一致性和并发性的需求。

三、MySQL设置隔离级别

MySQL数据库

  • 会话级别设置

    SET SESSION TRANSACTION ISOLATION LEVEL <level>;
    

    其中<level>可以是READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE之一。

  • 全局级别设置(需要管理员权限):

    SET GLOBAL TRANSACTION ISOLATION LEVEL <level>;
    

Java (使用JDBC)

在Java中,通过JDBC连接数据库时,可以使用Connection对象的setTransactionIsolation方法设置事务隔离级别:

Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

这里的Connection.TRANSACTION_READ_COMMITTED等常量对应不同的隔离级别。


### 注意事项- 设置事务隔离级别应在事务开始之前完成。
- 提高隔离级别通常意味着更强的数据一致性,但可能牺牲并发性能。
- 不同的DBMS在处理隔离级别的细节上可能有差异,尤其是关于幻读的处理。
- 在选择隔离级别时,要充分考虑业务需求和潜在的并发问题,进行适当的平衡。了解和选择正确的事务隔离级别对于设计高效、稳定的数据库应用程序至关重要。

相关文章:

经典面试题:什么是事物的隔离级别?什么是MVCC?

目录 前言一、事物的隔离级别二、隔离级别是如何实现的1. 锁定技术2. 多版本并发控制&#xff08;MVCC&#xff09;基本原理实现机制优缺点 3. 乐观锁与悲观锁 三、MySQL设置隔离级别MySQL数据库Java (使用JDBC) 前言 事务的四大特性&#xff08;ACID特性&#xff09;&#xf…...

Java程序中,不同jar包,有2个完全相同的类,运行时的加载顺序

在Java程序中&#xff0c;如果有两个完全相同的类存在于不同的jar包中&#xff0c;那么在运行时究竟加载哪个类&#xff0c;主要取决于类加载器的类路径&#xff08;Classpath&#xff09;搜索顺序。 Java使用类加载器&#xff08;ClassLoader&#xff09;来动态加载类。当Jav…...

EI期刊的定金和尾款

当涉及到EI&#xff08;工程索引&#xff09;期刊发表并支付定金和尾款时&#xff0c;许多学者和研究人员可能会感到担忧&#xff0c;因为这涉及到一定的风险。在探讨这个话题时&#xff0c;我们需要考虑几个因素&#xff0c;包括期刊的声誉、可信度、出版质量以及作者的权益保…...

python+pytest+pytest-html+allure集成测试案例

pythonpytestpytest-htmlallure集成测试案例 下面是pythonpytestpytest-htmlallure四个组件同时集成使用的简单案例。 1. 项目结构 project/ │ ├── src/ │ ├── __init__.py │ ├── main.py │ ├── tests/ │ ├── __init__.py │ ├── conftest.p…...

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…...

pycharm连接阿里云服务器过程记录

因为不想用自己的电脑安装anaconda环境,所以去查了一下怎么用服务器跑代码,试着用pycharm连接阿里云服务器,参考了很多博客,自己简单配置了一下,记录一下目前完成的流程. 主要是:阿里云服务器的远程登录和安装anaconda,以及怎么用pycharm连接阿里云服务器上的解释器. 小白刚开始…...

移动硬盘未格式化数据恢复及预防策略

随着数字化时代的到来&#xff0c;移动硬盘作为数据存储的重要载体&#xff0c;被广泛应用于个人和企业中。然而&#xff0c;当移动硬盘遭遇“未格式化”的困境时&#xff0c;其中的数据便岌岌可危。本文将深入探讨移动硬盘未格式化的现象、原因、数据恢复方案以及预防措施&…...

MySQL数据库入门之视图、存储过程、触发器

一、视图&#xff1a; 1.1、视图是什么&#xff1f;怎么理解&#xff1f; 视图是从数据库的基本表&#xff08;或者视图&#xff09;导出的虚表&#xff08;数据库只放定义&#xff0c;它不实际存储数据&#xff0c;而是根据用户定义的SQL查询动态生成的结果集&#xff0c;具…...

Kafka原生API使用Java代码-生产者-分区策略-默认分区策略轮询分区策略

文章目录 1、代码演示1.1、pom.xml1.2、KafkaProducerPartitioningStrategy.java1.2.1、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;不轮询1.2.2、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;轮询1.2.3、ProducerConfig.LINGER_MS_CONFIG取 1000…...

网页中的音视频裁剪拼接合并

一、需求描述 项目中有一个配音需求&#xff1a; 1&#xff09;首先&#xff0c;前台会拿到一个英语视频&#xff0c;视频的内容是A和B用英语交流&#xff1b; 2&#xff09;然后&#xff0c;用户可以选择为某一个角色配音&#xff0c;假如选择为A配音&#xff0c;那么视频在播…...

【入门】使用sklearn实现的KNN算法:鸢尾花数据集分类预测

目录 前言 第一步&#xff1a;安装和导入sklean模块 第二步&#xff1a;获取数据 第二步&#xff1a;分割出训练集和测试集 第三步&#xff1a;训练模型 第四步&#xff1a;测试结果 总结 前言 本文将介绍如何利用K最近邻&#xff08;KNN&#xff09;算法对经典的鸢尾花数…...

nss做题

[NCTF 2018]签到题 1.f12在index.php中找到flag [NSSCTF 2022 Spring Recruit]ezgame 1.在js源码中就有flag [UUCTF 2022 新生赛]websign 1.打开环境后发现ctrlu和右键&#xff0c;f12都被禁用了。两种方法&#xff0c;第一种&#xff1a;禁用js&#xff1b;第二中提前打开…...

​第18章:JDK8-17新特性

1. 新特性概述 > 角度1&#xff1a;新的语法规则 &#xff08;多关注&#xff09;比如&#xff1a;lambda表达式、enum、annotation、自动拆箱装箱、接口中的默认方法和静态方法、switch表达式、record等> 角度2&#xff1a;增加、过时、删除API比如&#xff1a;新的日期…...

哈希表练习题(2024/5/29)

1有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输…...

java —— 连接 MySQL 操作

MySQL 是独立于 java 之外的数据库&#xff0c;二者之间建立连接需要提前引入 mysql-connector-java 的 jar 包。 一、引入方法&#xff1a; ① 在项目中新建一个 Folder&#xff08;即文件夹&#xff09;&#xff0c;该文件夹通常命名为 lib&#xff0c;意思是存放项目所依赖…...

从 0 开始实现一个博客系统 (SSM 项目)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS pom 文件我就不放出来了, 之前用的 jdk8 做的, MySQL 用的 5.7, 都有点老了, 你们自己看着配版本就好 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截…...

C++标准模板(STL)- C 内存管理库 - 分配并清零内存 (std::calloc)

C 内存管理库 分配并清零内存 std::calloc void* calloc( std::size_t num, std::size_t size ); 分配 num 个大小为 size 的对象的数组&#xff0c;并初始化所有位为零。 若分配成功&#xff0c;则返回指向为任何对象类型适当对齐的&#xff0c;被分配内存块最低&#xf…...

嵌入式开发面试问题总结(持续更新)

面试问题总结 c/c 封装、继承和多态 封装&#xff1a;将属性和方法封装起来&#xff0c;并加以权限区分。继承&#xff1a;子类继承父类的特征和行为&#xff0c;复用了从基类复制而来的数据成员和成员函数&#xff08;基类私有成员无法被访问&#xff09;&#xff0c;其中构…...

意外发现openGauss兼容Oracle的几个条件表达式

意外发现openGauss兼容Oracle的几个条件表达式 最近工作中发现openGauss在兼容oracle模式下&#xff0c;可以兼容常用的两个表达式&#xff0c;因此就随手测试了一下。 查看数据库版本 [ommopenGauss ~]$ gsql -r gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2…...

使用Keepalived提高吞吐量和负载均衡ip_hash.

一 . Nginx使用Keepalived提高吞吐量案例 Keepalived[表示把连接保持一定长连接数来提高吞吐量] 1.1没有使用keepalived参数 upstream tomcats {server 192.168.28.102:8080; } server {listen 88;server_name www.tomcats.com;location / {proxy_pass http://to…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...