【MySQL 进阶之路】事务并发情况分析

news2025/1/9 14:40:19

MySQL事务并发控制分析笔记

在数据库系统中,事务并发控制至关重要,能够确保多个事务并发执行时的数据一致性、隔离性和正确性。MySQL通过不同的锁机制控制并发操作,以确保事务的隔离性。以下是对事务A和事务B并发行为的详细分析,并对锁粒度和事务行为进行了优化解读。

认识事务

在这里插入图片描述

场景一:事务A和事务B的并发行为(阻塞)

事务操作锁定情况结果
事务ASELECT FOR UPDATE 查询数据行级排他锁(X锁)锁定查询结果集中的行,其他事务无法修改这些行
事务BSELECT FOR UPDATE 查询相同数据被阻塞事务B被阻塞,直到事务A提交或回滚
事务BSELECT 查询数据无锁事务B可以继续执行读取操作,但无法修改数据
事务ACOMMIT 提交事务释放锁事务A提交后,行锁被释放,事务B可以继续执行操作
事务BUPDATE 修改数据行级排他锁(X锁)事务B可以更新数据(前提是事务A已经提交,锁已释放)
解释:
  1. 事务A执行SELECT FOR UPDATE:此操作会对查询结果集中的每一行加上行级排他锁(X锁),这意味着其他事务无法修改这些行,直到事务A提交或回滚。
  2. 事务B执行SELECT FOR UPDATE:事务B会被阻塞,因事务A已对相同的行加了排他锁。事务B需要等待事务A提交或回滚后才能继续执行。
  3. 事务B执行SELECT查询:在没有加锁的情况下,事务B可以继续执行读取操作,但无法进行修改操作。此时没有锁定数据,其他事务仍可修改数据。
  4. 事务A提交COMMIT事务:事务A提交后,事务A持有的排他锁被释放,事务B可以获取锁并继续执行操作。
  5. 事务B执行UPDATE:事务B可以在事务A提交后修改数据,前提是事务A已释放锁。

场景二:事务A和事务B的死锁场景

事务操作锁定情况结果
事务ASELECT FOR UPDATE 查询数据行级排他锁(X锁)锁定查询结果集中的行,其他事务无法修改这些行
事务BSELECT FOR UPDATE 查询相同数据行级排他锁(X锁)事务B被阻塞,等待事务A提交或回滚
事务AUPDATE 修改数据行级排他锁(X锁)事务A继续持有对该行的排他锁,进行更新操作
事务BUPDATE 修改数据行级排他锁(X锁)事务B也在等待事务A释放锁,但事务A同样在等待事务B释放锁,导致死锁
事务ACOMMIT 提交事务释放锁事务A提交后,死锁解除,行锁被释放
事务BCOMMIT 提交事务释放锁事务B提交并释放锁,系统恢复正常
死锁分析:
  1. 事务A和事务B各自对查询到的行执行SELECT FOR UPDATE,并分别对相同的行加了排他锁。
  2. 事务A在执行UPDATE时继续持有行级排他锁,试图修改数据。
  3. 事务B也执行了UPDATE,但它等待事务A释放锁,而事务A又在等待事务B释放它持有的锁。
  4. 这种互相等待的情况形成了死锁。数据库系统通过死锁检测机制(通常采用回滚策略)来解决死锁,系统会选择回滚其中一个事务,从而解除死锁。
结论:

在此场景中,事务A和事务B因为相互等待对方释放锁,最终导致了死锁。数据库会自动检测到这种情况并回滚其中一个事务,确保系统能够继续运行。

锁粒度与事务行为分析

锁的粒度决定了数据库如何限制多个事务之间的并发操作。MySQL支持多种类型的锁,常见的有行级锁和表级锁。不同的操作会使用不同粒度的锁,影响事务的并发性和执行效率。

操作类型锁粒度锁的行为说明
SELECT FOR UPDATE(查询单行)行级排他锁锁定查询到的行其他事务无法修改或删除该行,直到事务提交或回滚。
SELECT FOR UPDATE(查询多行)行级排他锁锁定查询到的所有行锁定所有符合查询条件的行,防止其他事务修改这些行。
SELECT(普通查询)无锁允许其他事务修改数据事务可以并发执行,但不能修改数据,适用于只需要读取的情况。
UPDATE行级排他锁锁定要更新的行在更新时获取排他锁,防止其他事务修改相同的行。
COMMIT 提交事务释放锁释放对数据行的锁提交时释放锁,其他事务可以获得锁并继续执行。
解释:
  1. SELECT FOR UPDATE:对查询结果集中的每一行加行级排他锁(X锁)。其他事务无法修改这些行,直到当前事务提交或回滚。
  2. SELECT查询:普通查询操作不加锁,多个事务可以并发执行读取操作。此时数据不会被锁定,其他事务可以对数据进行修改。
  3. UPDATE:在执行UPDATE时,数据库会对更新的行加排他锁,确保在当前事务提交前,其他事务无法修改相同的数据。
  4. COMMIT:提交事务时会释放所有加的锁。这样,其他事务可以获取到这些锁并继续操作。

认识死锁

在这里插入图片描述

如何避免死锁?

1. 锁的顺序控制

假设你有两个事务,分别操作相同的资源:A行和B行。为了避免死锁,你可以保证两个事务总是按照相同的顺序来获取锁。例如:

  • 事务A:先锁定A行,再锁定B行。
  • 事务B:同样先锁定A行,再锁定B行。

通过这种方式,即便两个事务同时请求A行和B行的锁,也不会发生交叉等待

2. 设置锁等待超时
SET innodb_lock_wait_timeout = 50;  -- 设置最大锁等待时间为50秒

在这个例子中,如果事务等待某个锁超过50秒,就会被回滚,从而避免无限期的等待。

3. 尽量缩短事务的执行时间

确保事务在获取锁之后,尽量快速完成操作,并尽早提交,以减少锁的持有时间。例如,避免在事务中执行长时间的计算或等待外部服务的操作。

START TRANSACTION;
SELECT * FROM my_table WHERE id = 1 FOR UPDATE;
UPDATE my_table SET value = value + 1 WHERE id = 1;
-- 做一些简单的计算和更新操作
COMMIT;  -- 提交事务

为了避免死锁,关键在于:

  • 保证锁的获取顺序一致,避免交叉等待。
  • 使用锁等待超时机制,避免因死锁导致事务无限期阻塞。
  • 减少锁持有的时间,尽量缩短事务执行的时间,避免长时间占用锁。
  • 使用合适的事务隔离级别和锁粒度,减少不必要的锁冲突。
  • 死锁检测和回滚机制,及时捕捉并解决死锁问题。

总结

在MySQL的事务并发控制中,不同的事务操作对数据产生不同的锁定效果。通过合理的锁机制控制,MySQL能够有效保证事务的隔离性,避免数据冲突和不一致。理解事务的并发行为和锁粒度,有助于开发人员在设计数据库操作时做出更好的决策,尤其是在处理高并发和复杂事务时,能够提升系统的效率和稳定性。

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

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

相关文章

如何在小米平板5上运行 deepin 23 ?

deepin 23 加入了 ARM64 支持,这里尝试将 deepin 系统刷入平板中,平常使用中,带个笔记本电脑有时候也会嫌比较麻烦,把 Linux 系统刷入平板中既满足了使用需要,又满足了轻便的需求。为什么不使用 Termux ?虽…

华为HarmonyOS 快速构建各种文本识别应用 -- 通用文字识别

适用场景 通用文字识别,是通过拍照、扫描等光学输入方式,将各种票据、卡证、表格、报刊、书籍等印刷品文字转化为图像信息,再利用文字识别技术将图像信息转化为计算机等设备可以使用的字符信息的技术。 可以对文档翻拍、街景翻拍等图片进行…

【系统架构核心服务设计】使用 Redis ZSET 实现排行榜服务

目录 一、排行榜的应用场景 二、排行榜技术的特点 三、使用Redis ZSET实现排行榜 3.1 引入依赖 3.2 配置Redis连接 3.3 创建实体类(可选) 3.4 编写 Redis 操作服务层 3.5 编写控制器层 3.6 测试 3.6.1 测试 addMovieScore 接口 3.6.2 测试 g…

【Docker】如何在Docker中配置防火墙规则?

Docker本身并不直接管理防火墙规则;它依赖于主机系统的防火墙设置。不过,Docker在启动容器时会自动配置一些iptables规则来管理容器网络流量。如果你需要更细粒度地控制进出容器的流量,你需要在主机系统上配置防火墙规则。以下是如何在Linux主…

java+ssm+mysql美妆论坛

项目介绍: 使用javassmmysql开发的美妆论坛,系统包含超级管理员,系统管理员、用户角色,功能如下: 用户:主要是前台功能使用,包括注册、登录;查看论坛板块和板块下帖子;…

【MFC】vs2019中使用sqlite3完成学生管理系统

目录 效果图list Contral 控件的简单使用使用sqlite3 效果图 使用sqlite3完成简单的数据库操作。 list Contral 控件的简单使用 本章只介绍基本应用 添加表头:语法: int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat LVCFMT_LEFT…

Java设计模式 —— 【创建型模式】建造者模式详解

文章目录 一、建造者模式二、案例实现三、优缺点四、模式拓展五、对比1、工厂方法模式VS建造者模式2、抽象工厂模式VS建造者模式 一、建造者模式 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过…

单链表(C语言版本)

前提 不探讨头结点空链表可以插入和查找,不可删除一般不选择phead移动,定义一个新结点把phead赋给他,移动新结点即可单链表不适合在前面和后面插入或删除,适合在后面插入删除 头插 void SLPushFront(SLTNode** pphead, SLTDataTy…

VMware虚拟机搭建和镜像配置

VMware虚拟机搭建和镜像配置 下载安装VMware 开始下载 更改安装路径,需要一个大空间的盘 更改后下一步 下一步后,选择不主动升级更新 一直下一步 直到安装完毕 输入许可密钥,我下载的版本是12,输入完成点击输入&#xff…

使用PPT科研绘图导出PDF边缘留白问题解决方案

使用PPT画图导出PDF格式后,边缘有空白,插入latex不美观,解决方案为自定义PPT幻灯片母版大小,如题步骤为: 1、查看已制作好的图片的大小,即长度和宽度 2、选择自定义幻灯片大小 3、自定义幻灯片大小为第1…

在Ubuntu上使用docker compose安装N卡GPU的Ollama服务

在现代计算环境中,利用 GPU 进行计算加速变得越来越重要。下面将讲解如何在Ubuntu上使用docker compose安装N卡GPU的Ollama服务。 1、安装 NVIDIA 容器工具 首先,需要确保你的系统已经安装了 NVIDIA 容器工具 nvidia-container-toolkit。这是让 Docker 容器访问 GPU 的关键…

如何借助前端表格控件实现金融投资分析平台?

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 金融投资分析背景介绍 金融投资分析是金融领域的核心活动,它要求对资产、市场及经济数据进行深入研究,以识别并评估潜在的投资机会与风险。这一过程融合了宏观经…

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板&#xff0c;NLP可以通过现成的模型对输入的语音、文字、图片进行处理&#xff08;分词、标词性、去停…

Python:import语句的详细解析(绝对路径导入和相对路径导入)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 import语句是Python中一个很重要的机制&#xff0c;允许在一个文件中访问另一个文件的函数、类、变量等&#xff0c;本文就将进行详细介绍。 在具体谈论import语句前&a…

CUDA 计时功能,记录GPU程序/函数耗时,cudaEventCreate,cudaEventRecord,cudaEventElapsedTime

为了测试GPU函数的耗时&#xff0c;可以使用 CUDA 提供的计时功能&#xff1a;cudaEventCreate, cudaEventRecord, 和 cudaEventElapsedTime。这些函数可以帮助你测量某个 CUDA 操作&#xff08;如设置设备&#xff09;所花费的时间。 一、记录耗时案例 以下是一个示例程序&a…

数字图像处理(15):图像平移

&#xff08;1&#xff09;图像平移的基本原理&#xff1a;计算每个像素点的移动向量&#xff0c;并将这些像素按照指定的方向和距离进行移动。 &#xff08;2&#xff09;平移向量包括水平和垂直分量&#xff0c;可以表示为&#xff08;dx&#xff0c;dy&#xff09;&#xff…

Hyper-V安装Win11虚拟机并设置vGPU显卡直通

一、为什么我使用Hyper-V虚拟机 我的宿主机是Win11,想装一个Win10或Win11虚拟机。但是我用VMware安装Win10或Win11后,随机地蓝屏,非常烦人,估计是和宿主机的某些设置有关,或者宿主机电脑硬件比较新(我电脑装Win10就会蓝屏,Win11就不会),某些特性不支持。 所以我就安…

Qt Xlsx安装教程

Qt Xlsx安装教程 安装perl 如果没有安装perl&#xff0c;请参考perl Window安装教程 下载QtXlsxWriter源码 下载地址 ming32-make编译32 lib库 C:\Qt\Qt5.12.12\5.12.12\mingw73_32>d: D:\>cd D:\Code\QtXlsxWriter-master\QtXlsxWriter-master D:\Code\QtXlsxWrit…

C# RSA加密和解密,RSA生成私钥和公钥

C# RSA加密和解密&#xff0c;RSA生成私钥和公钥&#xff08;使用XML格式秘钥&#xff09; 目录 前言生成xml格式的公钥和私钥 PrivateKeyPublicKey测试加密、解密 方案1&#xff1a;RSA公钥加密&#xff0c;RSA私钥解密方案2&#xff1a;RSA私钥加密&#xff0c;RSA私钥解密…