【MySQL】脏读、不可重复读、幻读介绍及代码解释

🍎个人博客:个人主页

🏆个人专栏: 数 据 库   

⛳️  功不唐捐,玉汝于成


目录

前言

正文

结语

我的其他博客


前言

        数据库事务隔离级别是关系数据库管理系统中一个重要的概念,它涉及到多个事务并发执行时如何保障数据的一致性和完整性。通过设置不同的隔离级别,开发者可以在一致性和性能之间做出权衡,根据应用的特点选择合适的隔离级别。然而,理解和正确使用隔离级别对于确保数据库系统的正确运行和数据的可靠性至关重要。在本文中,我们将深入探讨数据库事务隔离级别中的三个常见问题:脏读、不可重复读和幻读。

正文

脏读(Dirty Read)、不可重复读(Non-Repeatable Read)和幻读(Phantom Read)是数据库事务隔离级别中常见的问题,它们描述了在多个事务并发执行时可能出现的数据一致性问题。这些问题主要涉及到事务之间的读取和写入操作。

  1. 脏读(Dirty Read):

    • 概念: 一个事务读取了另一个事务尚未提交的数据。
    • 作用: 如果事务A读取了事务B的未提交数据,而B后来回滚,那么A读到的数据就是"脏数据",不准确且不稳定。
    • 代码示例:
      -- 事务1
      BEGIN TRANSACTION;
      UPDATE Account SET balance = balance - 100 WHERE account_id = 123;
      -- 此时未提交
      
      -- 事务2
      SELECT balance FROM Account WHERE account_id = 123; -- 脏读
      COMMIT; -- 事务1回滚,事务2读到的数据是脏数据
      

不可重复读(Non-Repeatable Read):

  • 概念: 一个事务在多次读取同一数据时,得到的结果不一致,即中间可能有其他事务修改了这个数据。
  • 作用: 可能导致事务在处理相同数据时,由于其他事务的修改而得到不一致的结果。
  • 代码示例:
    -- 事务1
    BEGIN TRANSACTION;
    SELECT balance FROM Account WHERE account_id = 123; -- 第一次读取
    
    -- 事务2
    UPDATE Account SET balance = balance - 50 WHERE account_id = 123;
    COMMIT; -- 提交了一个更新
    
    -- 事务1
    SELECT balance FROM Account WHERE account_id = 123; -- 第二次读取,结果不一致
    COMMIT;
    

幻读(Phantom Read):

  • 概念: 一个事务在多次查询时,得到了不同数量的符合条件的记录,这是由于其他事务插入、删除了符合条件的记录导致的。
  • 作用: 可能导致事务在处理一系列数据时,由于其他事务的插入或删除操作而得到不一致的结果。
  • 代码示例:
    -- 事务1
    BEGIN TRANSACTION;
    SELECT COUNT(*) FROM Employee WHERE salary > 50000; -- 第一次查询
    
    -- 事务2
    INSERT INTO Employee (id, name, salary) VALUES (1001, 'John', 60000);
    COMMIT; -- 提交了一个插入操作
    
    -- 事务1
    SELECT COUNT(*) FROM Employee WHERE salary > 50000; -- 第二次查询,结果不一致
    COMMIT;
    

在SQL Server中,可以通过设置事务的隔离级别来控制这些问题。常见的隔离级别包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。不同的数据库系统可能有不同的隔离级别实现方式和支持程度。以下是一个设置隔离级别的示例:

-- 设置隔离级别为READ COMMITTED
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 开始事务
BEGIN TRANSACTION;

-- 执行事务操作

-- 提交事务
COMMIT;

请注意,选择隔离级别时需要权衡一致性和性能之间的关系。更严格的隔离级别通常会导致性能下降,因为需要更多的锁和资源管理。

结语

         数据库事务隔离级别是数据库系统中维护数据一致性的关键组成部分。通过了解脏读、不可重复读和幻读这三个问题,我们能够更好地理解并预防在并发操作中可能出现的数据不一致情况。选择合适的隔离级别是一个权衡性能和数据一致性的过程,开发者需要根据应用的需求和特点来进行取舍。在实际开发中,深入理解事务隔离级别,并采用合适的机制来处理并发访问,将有助于提高数据库系统的可靠性和性能,确保应用能够以正确、可靠的方式运行。

我的其他博客

SpringCloud和Dubbo有哪些区别-CSDN博客

【JAVA面试题】static的作用是什么?详细介绍-CSDN博客

【JAVA面试题】final关键字的作用有哪些-CSDN博客

【JAVA面试题】什么是代码单元?什么是码点?-CSDN博客

【JAVA面试题】什么是深拷贝?什么是浅拷贝?-CSDN博客

【Linux笔记】系统信息-CSDN博客

【Linux笔记】网络操作命令详细介绍-CSDN博客

【Linux笔记】文件和目录操作-CSDN博客

【Linux笔记】用户和权限管理基本命令介绍-CSDN博客

Axure RP - 交互设计的强大引擎-CSDN博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/270576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

14、Qt使用Eigen3

一、下载Eigen Eigen 二、创建项目 创建一个"Qt Widget Application"项目,基类选择“QMainWindow“,把Eigen拷贝到项目中 三、更改代码 在.pro中添加 INCLUDEPATH $$PWD\Eigen 在界面上添加一个pushButton,并转到槽&#xff0…

SpringIOC之AbstractResourceBasedMessageSource

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

simulink代码生成(四)——SCI发送模块(串口通信)

C2000中的SCI模块分为两种,一种是接收模块,一种是发送模块; 1 发送模块 发送模块如下图所示: SCI传输块使用指定的SCI硬件模块传输标量或矢量数据。采样率和数据类型是与输入端口一致; 注意:一个模型只能…

让某个页面一直处于最前面,可以屏蔽切屏检测

前言 学习通智慧树网课分屏,让某个页面一直处于最前面,可以屏蔽切屏检测。 页面一直处于最前面 前言1 安装包2 使用 1 安装包 https://download.csdn.net/download/qq_44850489/76684366 2 使用 一直下一步就可以 选择要放到前面的窗口&#xff0c…

【SSM】Spring MVC

Spring MVC 文章目录 Spring MVC1. 简介2. 核心组件与调用流程3. 入门使用4. SpringMVC接收数据4.1 访问路径设置4.2 接收参数(重点)4.2.1 param 和 json参数比较4.2.2 param参数接收4.2.3 路径参数接收4.2.4 json参数接收 4.3 接收Cookie数据和接收请求…

蓝桥杯备赛 day 1 —— 递归 、递归、枚举算法(C/C++,零基础,配图)

目录 🌈前言 📁 枚举的概念 📁递归的概念 例题: 1. 递归实现指数型枚举 2. 递归实现排列型枚举 3. 递归实现组合型枚举 📁 递推的概念 例题: 斐波那契数列 📁习题 1. 带分数 2. 反硬币 3. 费解的…

SQL实践篇(二):为什么微信用SQLite存储聊天记录?

文章目录 简介什么是SQLite在python中使用SQLite通过SQLite查询微信的聊天记录参考文献 简介 SQLite是一个嵌入式的开源数据库引擎,大小只有3M左右,因此我们可以将整个SQLite嵌入到应用中,而不再需要采用传统的客户端/服务器(CS&…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

Jave EE 网络原理之网络层与数据链路层

文章目录 1. 网络层1.1 IP 协议1.1.1 协议头格式1.1.2 地址管理1.1.2.1 认识 IP 地址 1.1.3 路由选择 2. 数据链路层2.1 认识以太网2.1.1 以太网帧格式2.1.2 DNS 应用层协议 1. 网络层 网络层要做的事情,主要是两个方面 地址管理 (制定一系列的规则&am…

数字化协同在服装行业:监狱服装生产的量身解决方案

内容来自演讲:苗子实 | 北京宜通华瑞科技有限公司 | 产品经理 摘要 这篇文章介绍了宜通世纪子公司北京宜通华瑞在服装行业智能制造方面的业务,以及明道云提供的业务支持。文章提到了服装行业的痛点及解决方案,并详细介绍了优化监狱服装企业的…

算法练习Day20 (Leetcode/Python-回溯算法)

虽然看似进入了一个新章节,但其实还是前几天二叉树章节的延续。。 回溯算法 (以下内容摘抄自代码随想录): 回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构&…

C#获取企业微信《会话内容存档》

因为公司某些原因需要使用企业微信的会话内容存档内容,看微信的文档踩了一些坑,现在将项目代码记录下来,以备各位码农同行查阅。 项目使用 .NET8.0架构,节本结构如下图: 项目中的Lib是下载的微信SDK,项目地…

9道软件测试面试题,刷掉90%的测试程序员

经历了“金9银10”,转眼2024年招聘季就要来了,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?如何打败面试官?如何拿下那梦寐以求的offer? 如果你的跳槽意向已…

[C/C++]数据结构 希尔排序

🥦前言: 希尔排序也称 “缩小增量排序”,它也是一种插入类排序的方法,在学习希尔排序之前我们首先了解一下直接插入排序. 一: 🚩直接插入排序 1.1 🌟排序思路 直接插入排序的基本原理是将一条记录插入到已排好的有序表中&#x…

EDSR训练及测试教程

EDSR训练及测试教程 超分重建经典算法EDSR开源代码使用教程。 论文名称:Enhanced Deep Residual Networks for Single Image Super-Resolution,CVPR2017。 训练自己的数据集 由于EDSR开源代码只针对DIV2K数据集,在数据集加载时很多代码已经固定,因此在这里使用固定的文…

Android Studio 如何实现软件英文变中文教程

目录 前言 一、确认版本号 二、下载汉化包 三、汉化包安装 四、如何实现中英文切换 五、更多资源 前言 Android Studio是一款功能强大的集成开发环境(IDE),用于开发Android应用程序。默认情况下,Android Studio的界面和…

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 例程简介 例程分享 STM32的IC外设 IIC(Inter-Integrated Circuit),也称为IC或TWI(Two-Wire Interface),是一种广泛使用的串行…

数据仓库【1】:简介

数据仓库【1】:简介 1、诞生背景1.1、数据仓库诞生原因1.2、历史数据积存1.3、企业数据分析需要 2、基本概述2.1、数据仓库(Data Warehouse,DW)2.2、数据仓库特点2.3、数据仓库 VS 数据库 3、技术实现3.1、数据仓库建设方案3.2、传…

『CVE』简析CVE-2023-48795:SSH协议前缀截断攻击(Terrapin攻击)

文章目录 OpenSSH 9.6更新公告Terrapin攻击 (CVE-2023-48795)基本信息利用手段利用路径利用条件利用原理及示意图危害Terrapin-Scanner 基于Terrapin的潜在风险:CVE-2023-46445 & 46446参考完 OpenSSH 9.6更新公告 *ssh(1), sshd(8): implement protocol extens…

第十六节TypeScript 类

1、简介 TypeScript是面向对象的JavaScript。 类描述了所创建的对象共同的属性与方法。 2、类的定义 class class_name { // 类作用域 } 定义类的关键字是class,后面紧跟类名,类可以包含以下几个模块: 字段 – 字段是类里面声明的变量。字…