目录

事物隔离级别总结

实际情况演示

脏读(未提交)

避免脏读(读已提交)

不可重复读

可重复读

幻读


事物隔离级别总结

SQL标准定义了四种事物隔离级别,用来平衡事物的隔离性(Isolation)和并发性能。级别越高,数据一致性越好,但并发性可能越低,这四个级别是:

  • READ-UNCOMMITTED(读取未提交) :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。这种级别在实际应用中很少使用,因为它对数据一致性的保证太弱。
  • READ-COMMITTED(读取已提交) :允许读取并发事务已经提交的数据,可以阻止脏读但是幻读或不可重复读仍有可能发生。这是大多数数据库(如 Oracle, SQL Server)的默认隔离级别。
  • REPEATABLE-READ(可重复读)对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改可以阻止脏读和不可重复读,但幻读仍有可能发生。MySQL InnoDB 存储引擎的默认隔离级别正是 REPEATABLE READ。并且,InnoDB 在此级别下通过 MVCC(多版本并发控制) 和 Next-Key Locks(间隙锁+行锁) 机制,在很大程度上解决了幻读问题。
  • SERIALIZABLE(可串行化)最高的隔离级别,完全服从 ACID 的隔离级别所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

 默认级别查询:

MySQL InnoDB存储引擎的默认隔离级别是REPEATABLE READ。可以通过一下命令查看:

mysql> SELECT @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+

 InnoDB 的 REPEATABLE READ 对幻读的处理:

标准的SQL隔离级别定义里,重复读是无法防止幻读的。但InnoDB的实现通过一下机制很大程度上避免了幻读:

  • 快照读:普通的SELECT语句,通过MVCC机制实现。事物启动时创建一个数据快照,后续的快照读都读取这个版本的数据,从而避免了看到其他事务新插入到幻读(幻读)或修改的行(不可重复读)。
  • 当前读: 像SELECT...FOR UPDATE ,SELECT ..LOCK IN SHARE MODE ,INSERT,UPDATE,DELETE这些操作。InnoDB使用Next-Key来锁定扫描到索引记录及其间的范围(间隙),防止其他事务在这个范围内插入新的记录,从而避免幻读。Next-Key Lock是行锁(Record Lock)和间隙锁(Gap Lock)的组合。

值得注意的是,虽然通常认为隔离级别越高,并发性越差,但InnoDB存储引擎通过MVCC机制优化了可重复读级别。对于常见的只读或读多写少的场景,其性能与读已提交相比可能没有显著差异。不过,在写密集型且并发冲突较高的的场景下,RR的间隙锁的机制可能比RC带来更多的锁等待。

此外,在某些特定场景下,如需要严格一致性分布式事务(XA trransactions),InnoDB可能要求或推荐使用串行化隔离级别来确保原句数据的一致性。

《MySQL 技术内幕:InnoDB 存储引擎(第 2 版)》7.7 章这样写到:

InnoDB存储引擎提供了对XA事物的支持,并通过XA事务来支持分布式事务的实现。分布式事务指的是允许有多个事务资源(transactions resource)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么提交,要么都回滚,这对于事务原有ACID要求又有了提高。另外,在使用分布式事务时,InnoDB存储引擎的事务隔离级别必须设置为串行化。

实际情况演示

下面会使用2个命令行MySQL,模拟多线程(多事务)对同一份的数据的脏读问题。

MySQL命令行的默认设置中事务都是自动提交的,即执行SQL语句就会马上执行COMMIT操作。如果要显式地开启一个事务需要使用命令:START TRANSACTION

我们可以通过下面的命令来设置隔离级别。

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

 我们再看一下我们在下面实际操作中使用到一些并发控制语句:

  • STRAT TRANSACTION | BEGIN:显式地开启一个事务
  • COMMIT:提交事务,使得对数据库做的修改成为永久性。
  • ROOLBACK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

脏读(未提交)

避免脏读(读已提交)

不可重复读

还是刚才上面的读已提交的图,虽然避免了读未提交,但是出现了,一个事务还没有结束,就发生了不可重复读问题。

可重复读

幻读

演示幻读出现的情况

SQL脚本1在第一次查询工资为500的记录当时只有一条,SQL脚本2插入了一条工资为500的记录,提交之后,SQL1脚本在同一个事务中再次出现读查询发现了两条工资为500的记录这种就是幻读。

解决幻读的方法

解决幻读的方法有很多,但是它们核心的思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者是删除这张表中的数据了。解决幻读的方式主要有一下几种:

  • 将事务隔离级别调整为串行化
  • 在可重复读的事务级别下,给事务操作的这张表添加表锁。
  • 在可重复读的事务级别下,给事务操作的这张表添加Next-Key Lock(Record Lock +Gap Lock)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86463.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86463.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86463.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安卓开发】Kotlin入门教程

一、Kotlin 基础入门 1.1 Kotlin 简介 Kotlin 是一种由 JetBrains 开发的静态类型编程语言,运行在 Java 虚拟机上,也可以编译为 JavaScript 或原生代码。它于 2017 年被 Google 宣布为 Android 官方开发语言。 主要特点: 简洁:…

工业机器人保护气体节约方法

焊接在现代工业生产中作为一项关键技术,其效率和质量直接影响着产品的最终性能和生产成本。随着智能制造的不断推进,工业焊接机器人在自动化生产线中扮演着越来越重要的角色。焊接过程中的气体调节一直是一个技术难题,它直接关系到焊接质量的…

java中集合API

集合API 一、简述二、Collection(1).List1.ArrayList:2. LinkedList (2) Set 三、Map1.HashMap2. TreeMap 三、Iterator接口Collections工具类1.对集合元素进行排序2.基于Comparator,自定义方法(内部类)进行…

Oracle 用户权限与对象权限详解

一、权限体系概述 Oracle 数据库的权限管理是保障数据安全的核心机制,主要分为系统权限(System Privileges) 和对象权限(Object Privileges) 两大类: 系统权限:赋予用户在数据库中执行特定操作…

kubectl get pods 时 “client-side throttling, not priority and fairness“ 原因初探

1. 问题起源 在kubernetes里,使用kubectl get pods 时,返回 I0508 05:43:04.655602 100742 request.go:668] Waited for 1.178494016s due to client-side throttling, not priority and fairness, request: GET:https://10.103.0.1:443/apis/cert-ma…

力扣网C语言编程题:位运算来解决 “寻找重复数”

一. 简介 前面两篇文章解决力扣网上"查找重复数"的题目,提供了三种思路:哈希表、二分法和快慢指针。文章如下: 力扣网C语言编程题:“寻找重复数”的两种思路-CSDN博客 力扣网C语言编程题:快慢指针来解决 …

3D视觉感知

目录 3D视觉感知任务 单目3D感知 单目3D物体检测 – 直接预测3D信息 单目3D物体检测 – 总结 单目深度估计 双目3D感知 多目3D感知 3D视觉感知任务  输入:单摄像头或多摄像头生成的图像数据  单张图像  图像序列  输出  稀疏&#xff1a…

es中常规的根据字段查询时走什么索引(说明:「常规的根据字段查询」不包含分词查询)

在Elasticsearch中,“常规的根据字段查询”且不涉及分词的查询(如精确匹配、范围查询),主要依赖以下索引机制: 一、核心索引类型及适用场景 字段类型索引结构典型查询方式应用场景keyword倒排索引(未分词…

MYSQL如何插入数据,效率会更高

在MySQL中,插入数据的效率可以通过多种方式逐步提升。以下是从简单到复杂的优化路径,帮助你逐步提高数据插入的性能: 一、基础插入:逐条插入 这是最基础的插入方式,适用于少量数据的插入操作。虽然简单,但…

Rabbitmq的五种消息类型介绍,以及集成springboot的使用

交换机类型 Fanout Exchange 扇型交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列 Direct Exchange 直连型交换机,根据消息携带的路由键将消息投递…

日语学习-日语知识点小记-进阶-JLPT-真题训练-N2阶段(4):2022年12月2023年12月

日语学习-日语知识点小记-进阶-JLPT-真题训练-N2阶段(4):2022年12月&2023年12月 1、前言(1)情况说明(2)工程师的信仰(3)真题训练 2、2个卷的单词部分1、 真题-2023年…

从代码学习深度强化学习 - Actor-Critic 算法 PyTorch版

文章目录 前言算法原理1. 从策略梯度到Actor-Critic2. Actor 和 Critic 的角色3. Critic 的学习方式:时序差分 (TD)4. Actor 的学习方式:策略梯度5. 算法流程代码实现1. 环境与工具函数2. 构建Actor-Critic智能体3. 组织训练流程4. 主程序:启动训练5. 实验结果总结前言 在深…

Python 数据分析与可视化 Day 8 - Pandas 高级操作技巧

✅ 今日目标 掌握 Pandas 的索引体系(Index / MultiIndex)使用 set_index() 和 reset_index() 管理数据索引理解 pivot_table 与 melt、stack/unstack 重塑数据形态初步理解“宽表”与“长表”在数据分析与可视化中的应用场景 📚 一、深入理…

Spring Boot整合百度AI人脸比对实战

目录 一、简述 二、依赖 三、代码步骤 3.1 实体注入 3.2 服务实现 3.3 其它实现 四、小结 欢迎来到 盹猫(>^ω^<)的博客 本篇文章主要介绍了 [Spring Boot整合百度AI人脸比对实战] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ 一、简述 人脸识别在日…

使用 pip 安装 numpy 包卡在 Preparing metadata 阶段问题解决

TOC 1 问题描述 使用 pip 安装numpy卡在下面最后一行的阶段&#xff1a; Collecting numpy1.26.4 (from -r requirements.txt (line 2))Using cached https://mirrors.aliyun.com/pypi/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-…

新手向:Anaconda3的安装与使用方法

我们在刚开始接触Python时使用的是Python的直接编译器,如果我们需要进行其他的项目编写往往需要使用另一个版本的Python ,这样反复的下载很是麻烦并且还会造成系统变量的紊乱.这次我们引入Anaconda3,可创建虚拟的Python环境,满足不同项目的需要,当不用的时候可以直接放心删除不…

C#中的设计时构造函数

以下是关于设计时构造函数的详细整理&#xff0c;包括定义、适用场景、相关概念和实际应用&#xff1a; 一、设计时构造函数的定义 设计时构造函数&#xff08;Design-time Constructor&#xff09;是专门为开发工具&#xff08;如Visual Studio、Blazor Designer等&#xff0…

Spring Boot 2.x 项目搭建 (一)

以下是基于Spring Boot 2.x&#xff08;兼容JDK 1.8&#xff09;的项目搭建指南及Markdown文档生成方案&#xff0c;整合了多个搜索结果中的最佳实践&#xff1a; 一、项目初始化 1. 使用Spring Initializr创建项目 步骤&#xff1a; 访问 start.spring.io 或通过IDE&#x…

Kotlin作用域函数:掌握apply/let/run/with/also精髓

一、作用域函数详解 1. apply&#xff1a;对调用对象进行配置或操作&#xff0c;并返回该对象本身。 接收者引用&#xff1a;this&#xff08;可省略&#xff0c;直接调用接收者成员&#xff09;返回值&#xff1a;接收者对象本身&#xff08;T&#xff09;核心用途&#xff…

Spring Boot监视器:应用监控终极指南

Spring Boot 监视器详解 Spring Boot 监视器(Monitor)是用于监控和管理 Spring Boot 应用程序运行状态的核心组件,主要通过 Spring Boot Actuator 和 Spring Boot Admin 两大工具实现。 一、核心监视器组件 1. Spring Boot Actuator 功能定位:提供应用程序内部运行状态的原…