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

news2024/9/23 19:14:55

🍎个人博客:个人主页

🏆个人专栏: 数 据 库   

⛳️  功不唐捐,玉汝于成


目录

前言

正文

结语

我的其他博客


前言

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

正文

脏读(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博客

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell三剑客:awk(awk编辑编程)二

一、IF 语句 IF 条件语句语法格式 #方式一: if (condition)action #方式二:使用花括号语法格式 if (condition) {action1;action2; ... } {if(表达式){语句1;语句2;...}} IF 语句实例 #判断数字是奇数还是偶数 [rootlocalhost ~…

Kafka生产环境问题总结与性能优化实践

Kafka可视化管理工具kafka-manager 安装及基本使用可参考: httos://wwwcnbloas.com/dadonaaa/o/8205302.html 线上环境规划 1. 消息丢失情况: 消

数据入表倒逼数据治理,国有企业如何做好数据资产管理

数据是驱动数字经济发展的核心生产要素,数据资产化是释放数据要素价值的重要方式。国有企业作为驱动数字化转型升级的排头兵,在数据资产入表的背景下,如何充分发挥海量规模数据和应用场景等优势,如何解决数据难点,管好…

ES8生产实践——Kibana对接Azure AD实现单点登录

基本概念介绍 什么是单点登录 单点登录(Single Sign-On,SSO)是一种身份验证和访问控制机制,允许用户使用一组凭据(通常是用户名和密码)仅需登录一次,即可访问多个应用程序或系统,而…

算法基础之最长公共子序列

最长公共子序列 核心思想: 线性dp 集合定义 : f[i][j]存 a[1 ~ i] 和 b[1 ~ j] 的最长公共子序列长度 状态计算: 分为取/不取a[i]/b[j] 共四种情况 其中 中间两种会包含两个都不取的情况(去掉) 但是因为取最大值 有重复也没事用f[i-1][j] 和 f[i][j-1]表…

GNN 图神经网络

GCN 邻接矩阵A:adjacency matrix用来表示节点间的连接关系。 度矩阵D:degree matrix用来表示节点的连接数 特征矩阵X:feature matrix用来表示节点的特征

openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析

文章目录 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表 执行计划生成器需要使用表的统计信息,以生成最有效的查询执行计划&#…

Sam Altman 晒网友新年愿望清单;AI Pin 明年 3 月开始交付丨 RTE 开发者日报 Vol.112

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

什么是非功能性测试?

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

AI爆文写作变现:如何让自己的文章减少AI味,提升写作质量

利用AI实现自媒体写作变现,核心就是爆文写作提示词(Prompt) 对新手来说,缺少好用的爆文提示词,这无疑是大家碰到的一个难点。 如何创建属于自己的高效AI指令,无疑是大家最关心的问题。 本篇文章将一步一…

计算机网络——网络层(四)

前言: 前面我们已经对物理层和数据链路层有了一个简单的认识与了解,现在我们需要对数据链路层再往上的一个层,网络层进行一个简单的学习与认识,网络层有着极其重要的作用,让我们对网络层进行一个简单的认识与学习吧 目…

市场复盘总结 20231225

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: SELECT CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,主力净额,DDE大单净量,CONVERT(DATETIME, 最后封…

nosql--RedisTemplate定制化

nosql--RedisTemplate定制化 1、序列化2、如果使用redis中保存数据会使用默认的序列化机制,导致redis中保存的对象不可视2.1将所有的对象以JSON的形式保存2.2配置reids自定义配置2.3转化成功2.4配置文件代码 3redis客户端 1、序列化 stringRedisTemplate RedisTemp…

Cesium.js三维地图的实现(依托天地图CDN文件)

零、技术选型: Vue2、VueCli5、天地图、Cesium.js 一、通过天地图官网案例实现 需要引入天地图官方提供的CDN链接访问Cesium.js相关文件 相关文件: https://api.tianditu.gov.cn/cdn/demo/sanwei/static/cesium/Cesium.js https://api.tianditu.gov.cn/…

解决Qt“报无法定位程序输入点xxx于动态连接库“问题

今天,在使用QtVS2019编译工程时,弹出"无法定位程序输入点xxx于动态链接库"问题,如图(1)所示: 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多: (1) 工程Release/Deb…

实战教学:零食百货商城小程序开发全程指导

随着移动设备的普及和互联网技术的发展,小程序成为越来越多人的选择,特别是在购物方面。开发一个零食百货商城小程序,可以让你在手机上随时随地购买各种零食,方便快捷。本文将为你提供全程指导,让你轻松开发一个成功的…

2023读书笔记57|《顾城诗选》——我们走进了夜海, 去打捞遗失的繁星

2023读书笔记57|《顾城诗选》——我们走进了夜海, 去打捞遗失的繁星 细雨,洗去空气中的浮尘, 薄暗里蜜酒散开阵阵醇香。 野蜂在风雨的摇荡中开始安眠, 带着无限甜美的梦想。 河岸边,开满了耀眼的冰花。 沙洲上&#x…

算法导论复习(四)主方法的专题

主方法我们要记住的是什么呢?

详细学习Java注解Annotation、元注解(通俗易懂,一学就会)

概述 底层原理 自定义注解 示例代码: 1. 2.只有属性名为value的才可以,java对它进行了标识,如果是其他别名如value1是不行的 3.多个属性,必须用键值对形式,不能少写,也不能多写,除非有default修…

【DevOps 工具链】软件版本号命名规范 - 3种规则(读这一篇就够了)

文章目录 1、简述2、常见软件的版本号命名规则3、版本号命名规范整理3.1、XYZ/MMP3.1.1、规则3.1.2、确定3.1.3、举例3.1.4、详细规则 3.2、XYZD/MMPD3.3、VRC3.3.1、规则3.3.2、对"Vxxx"的说明3.3.3、对"Rxxx"的说明3.3.4、对"LLL"的说明3.3.5、…