数据库并发操作可能出现的问题及解决方式

MySQL~数据并发问题(脏写、脏读、不可重复读、幻读)与SQL隔离级别演示 文章目录数据并发问题脏写脏读不可重复读幻读MySQL中的隔离级别如何设置事务的隔离级别 数据并发问题 脏写 脏读 不可重复读 幻读 四个问题严重性从高到低: 脏写、脏读、不可重复读、幻读 MySQL中的隔离级别 脏写的问题非常严重,不论是哪种隔离级别,都不允许脏写的问题发生 查看默认的隔离级别: mysql> show variables like 'transaction_isolation'; +-----------------------+-----------------+ | Va 阅读详情
AI摘要

本文详细阐述了并发操作可能引发的问题,包括丢失更新、脏读、幻读及不可重复读等现象,并介绍了通过设置不同的事务隔离级别来解决这些问题的方法。

并发操作可能出现的问题
问题描述
第1类丢失更新事务A撤销时,把已经提交的事务B的更新数据覆盖了
第2类丢失更新事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失。
脏读A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。
幻读事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行
不可重复读事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了
  • 第1类丢失更新:事务A撤销时,把已经提交的事务B的更新数据覆盖了
时间取款事务A转账事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4查询账户余额为1000元
T5汇入100元修改余额为1100元
T6提交事务
T7取出100元将余额修改为900元
T8撤销事务
T9余额恢复为1000元(丢失更新)
  • 第2类丢失更新:事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失。
时间转账事务A取款事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4查询账户余额为1000元
T5取出100元将余额修改为900元
T6提交事务
T7汇入100元将余额修改为1100元
T8提交事务
T9查询账户余额为1100元(丢失更新)
  • 脏读(Dirty Read):A事务读取B事务尚未提交的数据并在此基础上操作,而B事务执行回滚,那么A读取到的数据就是脏数据。
时间转账事务A取款事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4取出500元余额修改为500元
T5查询账户余额为500元(脏读)
T6撤销事务余额恢复为1000元
T7汇入100元把余额修改为600元
T8提交事务
  • 幻读(Phantom Read):事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行。
时间统计金额事务A转账事务B
T1开始事务
T2开始事务
T3统计总存款为10000元
T4新增一个存款账户存入100元
T5提交事务
T6再次统计总存款为10100元(幻读)
  • 不可重复读(Unrepeatable Read):事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过了。
时间转账事务A取款事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4查询账户余额为1000元
T5取出100元修改余额为900元
T6提交事务
T7查询账户余额为900元(不可重复读)
如何处理

使用锁机制:
mysql中设置事务隔离级别,自动加锁

读未提交 – 会发生脏读。
读提交 – 会发生不可重复读,不会读到脏数据。
可重复读 – 重复读到之前的数据,在一个事务中。

隔离级别第一类丢失更新第二类丢失更新脏读幻读不可重复读
READ UNCOMMITED不允许允许允许允许允许
READ COMMITTED不允许允许不允许允许允许
REPEATABLE READ不允许不允许不允许允许不允许
SERIALIZABLE不允许不允许不允许不允许不允许

需要说明的是,事务隔离级别和数据访问的并发性是对立的,事务隔离级别越高并发性就越差。所以要根据具体的应用来确定合适的事务隔离级别,这个地方没有万能的原则。

测试不同隔离级别下并发操作出现的问题

在Linux系统中进行测试
因为mysql是自动提交的,首先开启事务环境
使用 begin 或者 start transaction 都可以开启一个事务环境

开启事务环境

mysql> begin; 
mysql> start transaction ;

提交事务

mysql> commit;

回滚事务

mysql> rollback;

查看事务

mysql> select @@tx_isolation;

在这里插入图片描述
设置事务隔离级别

mysql> set session transaction isolation level read uncommitted;

同时开启两个窗口,对同一个数据进行操作,对并发操作出现的问题进行测试

  • 场景一:读脏数据
        事务A:
            ~ begin;
            ~ update tb_emp set sal=2800 where eno=1359;
        事务B:
            ~ set session transaction isolation level read uncommitted;
            ~ begin;
            ~ select * from tb_emp; ---> 读脏数据
            ~ commit;
        事务A:
            ~ rollback;
  • 场景二:不可重复读
    事务B:
        ~ set session transaction isolation level read committed;
        ~ begin;
        ~ select * from tb_emp where sal<3000;
    事务A:
        ~ begin;
        ~ update tb_emp set sal=3800 where eno=1359;
        ~ commit;
    事务B:
        ~ select * from tb_emp wehre sal<3000; ---> 没有1359对应的记录了,不可重复读
        ~ commit;
数据库—事务—并发控制技术 111 阅读详情

相关推荐

浅析数据库(DB)、操作数据存储(ODS)和数据仓库(DW)的区别与联系

文章背景:相信大部分刚接触上面三个概念的同学,都多多少少会有些迷惑,现在我就给大家简单分析下这三者的关系,希望大家对这三者的概念理解有所帮助吧。本文主要从下面两类关系来叙述上面三者的关系: 数据库(DB)和数据仓库(DW)的区别与联系 操作数据存储(ODS)和数据仓库(DW)的区别与联系 数据库与数据仓库的区别与联系数据库与数据仓库基础概念:数据库:传统的关系型数据库的主要应用,主要是基本的、日常的

Mike_ToUp 2万+

MySQL的脏写、脏读、不可重复读、幻读 解读

1、脏写 两个事务没提交的状况下,都修改统一条数据,结果一个事务回滚了,把另外一个事务修改的值也撤销了,所谓脏写就是两个事务没提交状态下修改同一个值。 示例:事务A和事务B同事在更新一条数据,事务A先把他更新为A值,事务B紧接着就把他更新为B值,如下图所示: 事务A先更新数据值为A,事务B再更新数据值为B,此时事务A突然回滚,回滚为A之前的数据 因为事务A回滚数据导致事务B的值也变回了A之前的数据 2、脏读 你修改了一条数据的值,还没有提交,另一个事务就读到了你修改的值,然后你回滚了,.

Kieran_s的博客 2556

多台应用同时操作一张表数据,解决并发问题

遇到的问题:多台应用部署调度任务,同时扫一张表的数据,并且对一张表的数据进行操作,可能出现的问题是一条数据被操作了两次,从而出现了并发性的问题。 解决办法:从sql上解决问题,并且限制查询条数。 例:假设三台应用部署调度任务。 对数据表的主键取余,若是被除数配置为4,则所有的余数为0,1,2,3。所以需要保证每台应用所执行的sql里面刚好包含这4个数字。当然需要在程序里面根据配置文件

SumeriZhanYg 1万+

多版本并发控制MVCC--MySQL

MySQL中MVCC介绍

Littewood的博客 1024

【分子指纹】化学分子指纹的概念和应用(非常重要)

分子指纹(Molecular fingerprints)可以低计算成本的方式表示大规模化学数据集中化合物的化学(结构、物理化学等)性质。它们在将化学数据集中的分子转换为适合于计算方法的一致输入格式(bit向量或数值)方面发挥着重要作用。在这篇综述中,

DJJ5210的博客 1万+

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型)

本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。

weixin_30482383的博客 702

【数据库】MySQL的ReadView

MYSQL的READ VIEW机制

Cool_Wayen的博客 5290

【实战】ESP32 + LN298N 实现电动推杆的闭环位置伺服控制

本文详细介绍了如何使用ESP32微控制器和LN298N电机驱动模块,为普通电动推杆增加编码器反馈,实现精准的闭环位置伺服控制。文章从硬件选型与接线讲起,深入解析了编码器四倍频计数原理与位置换算,并重点阐述了PID控制算法的核心思想、代码实现及参数整定方法,旨在帮助读者从零构建一个反应迅速、定位精准的智能执行器系统。

weixin_29195615的博客 318

MySQL MVCC的详解之Read View

本文由浅入深讲解了MySQL MVCC实现机制,以及其基础READ VIEW判定

weixin_38597669的博客 3623

国内用户稳定开通ChatGPT Plus会员的完整实操指南

ChatGPT作为当前最先进的AI对话模型,其技术原理基于Transformer架构和大规模语言预训练。通过深度学习技术,ChatGPT能够理解自然语言并生成高质量回复,在代码生成、文档分析等场景具有重要技术价值。对于需要高频使用的开发者而言,ChatGPT Plus会员提供了优先访问权和GPT-4模型支持等核心功能。在实际应用场景中,国内用户常面临支付限制和区域封锁等挑战。本文针对这些痛点,重点解析如何通过可靠的支付渠道和账号安全策略,实现稳定的会员开通方案,帮助用户突破技术使用壁垒,充分发挥AI助手在开

weixin_29042035的博客 954

PyGPT:桌面AI助手整合大模型与本地知识库,打造高效工作流

大语言模型(LLM)通过理解和生成自然语言,正深刻改变人机交互方式。其核心原理是基于海量数据训练的Transformer架构,能够根据上下文进行预测和生成。这一技术价值在于将强大的AI能力平民化,广泛应用于代码生成、文档分析、创意写作和智能问答等场景。通过API调用云端模型或本地部署开源模型,开发者可以构建个性化的AI应用。本文聚焦于PyGPT这一桌面AI助手,它巧妙地将ChatGPT、Claude、Gemini等主流大模型与LlamaIndex、Ollama等本地化工具整合,实现了聊天、文件分析、代码解释

weixin_28679635的博客 437

利用无事务方式插入数据库解决并发插入问题

由于项目中同一个网元,可能会被多个不同用户操作,而且操作大部分都是以异步子任务形式进行执行,这样就会带来并发写数据问题,本文通过利用无事务方式插入数据库解决并发插入问题,算是解决问题的一种思路,算是抛砖引玉吧。

jike11231的博客 786

SAP FI实战入门:从借贷法则到F-02记账,新手必懂的会计凭证操作

本文详细介绍了SAP FI模块中借贷记账法的核心逻辑及F-02凭证录入的全流程操作。通过实例解析借贷方向规则、科目编码设置及金额镜像原则,帮助新手快速掌握会计凭证操作技巧。同时提供了FS10N余额查询和常见错误排查方法,助力用户高效完成SAP财务记账任务。

weixin_29306571的博客 263

数据库-并发控制

多事务执行方式 多个事务如何一起执行呢? 1. 事务串行执行:每个时刻只有一个事务运行,其他事务必须等到这个事务结束后方能运行。(事务一个接一个的运行) 2. 交叉并发方式:在单处理机系统中,并行事务并行操作轮流交叉运行。 这种并行执行方式称为交叉并发方式。 3. 同时并方式:在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行,这种并...

叶叶 2万+

mongoDB 数据莫名其妙的没了

问题 之前没有接触过mongoDB,然后接手一个项目使用的是MongoDB,我就跟着网上的教程搭建一个MongoDB的服务,并运行起来。 一开始没有啥问题,成功的把服务与MongoDB都启动以来,运行也没有问题。但是过了几天,我再次打开时发现,以前的数据神奇的消失了。我还在想,是有什么定时清除的么,还是什么原因导致崩了然后数据就被清理了。 查找原因 第一次遇到我没有在意,重启了一下MongoDB,...

技术熊的博客小窝 1万+

YOLOv11安卓端部署终极指南:从训练到NCNN移植,30分钟搞定手机实时检测!

本文详细介绍了YOLOv11模型在安卓设备上的NCNN部署全流程。主要内容包括:1) 环境配置要求(Python3.8+、PyTorch、NCNN框架等);2) COCO2017数据集准备与配置;3) 模型训练建议(使用RTX3090,50-100个epoch);4) 模型导出转换步骤(ONNX格式转换、NCNN优化);5) 安卓端实现的关键优化(快速sigmoid实现、纯C++NMS等)。项目在安卓CPU模式下可实现20FPS的稳定检测,并提供了激活函数选择、模型量化等性能调优建议。通过参考多个开源项目,

FJN110的博客 1726

【Redis】缓存和数据库一致性问题及解决方案

Redis与MySQL的数据一致性解决方案

秋玄的博客 1740

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

并发控制

并发控制 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源的特点 (2)交叉并发方式(interleaved concurrency) 事务的并行执行是这些并行事务的并行操作轮流交叉运行 是单处理机系统中的并发方式,能够减少处理机的空闲时间,提高系统的效率 (3)同时...

圣三一 1431

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Hibernate事务与并发问题处理

Hibernate事务与并发问题处理(乐观锁与悲观锁) 一、数据库事务的定义   数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为

Ned_mahone的博客 443

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

事务并发的可能问题与其解决方案 -----数据库的隔离级别和 悲观锁、乐观锁

一、多个事务并发时可能遇到的问题 Lost Update 更新丢失 a. 第一类更新丢失,回滚覆盖:撤消一个事务时,在该事务内的写操作要回滚,把其它已提交的事务写入的数据覆盖了。 b. 第二类更新丢失,提交覆盖:提交一个事务时,写操作依赖于事务内读到的数据,读发生在其他事务提交前,写发生在其他事务提交后,把其他已提交的事务写入的数据覆盖了。这是不可重复读的特例。 Dirty Read 脏读...

yinni11的博客 303

如何有效处理数据并发操作问题

本篇文章以我在真实项目中遇到的数据并发问题作为背景,讲解问题出现的原因及解决的办法,以及从中得到的反思。并发中踩过很多坑,可能还有不足的地方,但会一直学习成长,现在将学习到的东西记录下来,,,,努力努力。 一:并发操作出现的原因 原因:多个动作在一瞬间同时操作同一数据 现象: 多人在某一瞬间通过相同的方式操作同一条数据 多人在某一瞬间通过不同的方式操作同一条数据 在某一瞬间,同一动作,...

许洪昌的博客 8545

数据库DB与数据仓库DW区别和联系

数据库(DB)和数据仓库(DW)的区别与联系 数据库与数据仓库基础概念: 数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。 数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 OLTP和OLAP概念补充: 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line

信竞星球_少儿编程题库 2471

事务并发的可能问题与其解决方案

一、事务并发的问题 这些问题可以归结为5类,包括3类数据读问题(脏读、不可重复读和幻象读)以及2类数据更新问题(第一类丢失更新和第二类丢失更新) 脏读(dirty read) A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。来看取款事务和转账事务并发时引发的脏读场景: 在这个场景中,B希望取款500元而...

Windsearcher的博客 6107

更新操作先删除缓存后更新DB,还是先更新DB后删除缓存问题???

以前自己在学校学习redis的时候还真没想到这么多,上班后看公司的项目代码,发现都是先更新DB,然后删除缓存,而且更新DB后不会立马将DB数据放入缓存,然而我以前不管是查询还是update都是操作完DB后立马放入缓存。。。 扯远了,回到重点,为什么先更新DB后删除缓存呢?听我慢慢道来~ 问题场景:当数据出现变化的时候,DB和redis的一致性就显得非常重要!并发的情况下,主要是看场景,和代价,进行选择。 目前主要有两种策略: 先删除缓存后更新DB(用的少,容易产生大量的脏数据) 结论:容易产生脏数据(

Hello什么来着? 3595

ElasticSearch 并发操作问题

解决并发问题 https://www.elastic.co/guide/cn/elasticsearch/guide/current/concurrency-solutions.html 问题的原因是 Elasticsearch 不支持 ACID 事务。 对单个文件的变更是 ACIDic 的,但包含多个文档的变更不支持。 如果你的主要数据存储是关系数据库,并且 Elasticsearch 仅仅作...

牧心人的专栏 3829

数据库并发操作异常及解决办法

文章目录数据库的并发操作丢失修改丢失修改的解决方案数据库的隔离级别脏读不可重复读幻读参考资料 数据库的并发操作 操作系统中对于并发的定义:并发是指两个或多个事件在同一时间间隔内发生。 注意同一时间间隔(并发)和同一时刻(并行)的区别。在多道程序环境下,一定时间内,宏观上有多道程序在同时执行,而在每个时刻,单处理机环境下仅有一道程序能够执行,因此微观上这些程序仍是分时交替执行的。操作系统的并发性是通...

flyawayl的博客 3228
上一篇: Django 中的 ORM 机制
下一篇: mysql 函数和过程
张遥
博客等级 码龄8年 20粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值