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

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.rhkb.cn/news/487185.html

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

相关文章

NanoLog起步笔记-6-StaticLogInfo

nonolog起步笔记-6-StaticLogInfo StaticLogInfo文件名和行号文件名和行号的传入log参数 RuntimeLogger::registerInvocationSitelogid为什么只能被赋一次值 reserveAlloc加入消息头finishAlloc返回 StaticLogInfo 写C语言编译前端时,给我印象深刻的一部分是&#…

不是“我应该做什么”,而是“我想做什么”

1. 识别内心的渴望 首先,我们需要识别自己真正的愿望和激情所在。这可能需要一些时间和自我反思。问自己:在没有任何外界压力的情况下,我真正想做的是什么?是赚钱、生活、旅行、追星,还是其他什么?识别这些…

Java-JMX (官方文档解读)

JMX 简介 JMX(Java Management Extensions)是Java平台的一个标准管理框架,自Java 1.5版本起成为Java 平台标准版 (Java SE 平台) 的标准组成部分。JMX 技术提供了一种简单、标准的方法来管理资源(例如应用程序、设备和服务&#x…

商品期权开户条件是什么?

商品期权开户条件是什么? 商品期权是一种金融衍生品,它赋予期权持有者在特定日期(欧式期权)或在特定日期之前(美式期权),以特定价格(行权价格)买入或卖出一定数量的某种…

RISC-V IO 虚拟化架构在 X100 芯片上的实现

安全之安全(security)博客目录导读 本篇博客,我们聚焦RISC-V 2024中国峰会上RISC-V虚拟化相关专题中的IOMMU虚拟化在X100芯片上的实现,来自进迭时空郑律老师。 我们先来看下X100的RISC-V芯片和已有的关于处理器内核虚拟化和内存虚拟化相关的支持 关于IOMMU的特性支持,下图红…

Windows 系统没有网络链接常见原因以及解决方案

在使用 Windows 电脑时,有时会遇到电脑显示已连接网络,但却无法访问 Internet 的情况,这可能是由多种原因导致的。以下简鹿办公将详细介绍一些常见原因及对应的解决方案。 一、网络连接问题 原因 路由器故障:路由器长时间运行可…

【Rive】事件回调

1 前言 Android 中可以通过 RiveAnimationView 的 addEventListener 方法添加动画监听器,用于监听状态动画和过渡动画的开始和结束时机,实现动画开始和结束时的事件回调;也可以监听 Rive 事件触发的时机,在事件触发时响应回调。 …

Springboot3整合Redis

书接上篇《Redis 安装篇&#xff08;阿里云服务器&#xff09;_阿里云安装redis-CSDN博客》&#xff0c;安装好Redis后&#xff0c;就需要在springboot项目中使用Redis了。 一、SpringBoot整合Redis 1.添加坐标 <!--redis--> <dependency><groupId>org.sp…

REDMI瞄准游戏赛道,推出小屏平板

近日&#xff0c;REDMI推出了一款8.8英寸的小屏平板&#xff0c;引发市场关注。该平板采用LCD屏幕&#xff0c;搭载天玑9400处理器&#xff0c;定位游戏市场&#xff0c;意在开拓小屏平板的新领域‌。 ‌小屏平板新尝试‌ 这款REDMI平板未追随大屏潮流&#xff0c;而是选择了8…

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

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

OllyDbg、CE简单介绍

基础知识&#xff1a; 想要破解软件&#xff0c;需要一些基础知识&#xff1a; 文件格式&#xff1a;Windows对应PE、Linux对应ELF、IOS对应Mash-0。文件格式是指操作系统规定的每个段&#xff08;代码段、数据段、堆、栈&#xff09;的大小、顺序等信息。 汇编语言&#xff1…

泷羽sec学习打卡-brupsuite4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-proxy proxyInterceptHTTP history/WebSocket history&#xff08;历史记录&a…

Wallpaper壁纸制作学习记录10

图像准备 外部图像编辑器快速访问 Wallpaper Engine 允许您配置自己喜欢的外部图像编辑器&#xff0c;以用作补充图像编辑工具&#xff0c;您可以在整个编辑器中快速访问该工具。 您可以在Wallpaper Engine 编辑器中配置您选择的图像编辑器&#xff0c;通过顶部的文件菜单&am…

【C++算法】36.位运算_只出现一次的数字 II

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;解析 题目链接&#xff1a; 137. 只出现一次的数字 II 题目描述&#xff1a; 解法 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。说明时间复杂度O(n)&#xff0c;空间复杂…

transformer学习笔记-自注意力机制(1)

自注意力机制&#xff0c;可以说是transformer中最核心的部分之一&#xff0c;注意力机制&#xff0c;主要是在处理序列数据时&#xff0c;根据序列数据提供的上下文环境信息识别需要关注的特征数据&#xff0c;注意力机制通常用于不同序列之间的交互&#xff0c;表示不同序列环…

日志基础示例python和c++

文章目录 0. 引言1. python2. c 0. 引言 本文主要记录python版本和c版本常用的日志基础示例。 1. python python版本常用的是logging库&#xff0c;结合colorlog库&#xff0c;可根据不同日志级别打印不同颜色的日志&#xff0c;为了便于分析问题&#xff0c;还添加了日志保…

TimeXplusplus——提高时间序列数据的可解释性,避免琐解和分布偏移问题的深度学习可解释性的框架

摘要 论文地址&#xff1a;https://arxiv.org/abs/2405.09308 源码地址&#xff1a;https://github.com/zichuan-liu/timexplusplus 信号传输技术的优化对于推动光通信的发展至关重要。本文将详细探讨线路编码技术的目标及其实现方式。线路编码旨在提高带宽和功率效率&#xf…

python爬虫--某房源网站验证码破解

文章目录 使用模块爬取目标验证码技术细节实现成果代码实现使用模块 requests请求模块 lxml数据解析模块 ddddocr光学识别 爬取目标 网站验证码破解思路是统一的,本文以城市列表为例 目标获取城市名以及城市连接,之后获取城市房源信息技术直接替换地址即可 验证码 技术…

TimesFM模型论文内容

全文总结 这篇论文提出了一种基于解码器架构的时间序列预测基础模型TimesFM&#xff0c;旨在通过零样本学习在多种公共数据集上实现接近于监督学习模型的预测精度。 研究背景 研究问题&#xff1a;这篇文章要解决的问题是如何设计一个时间序列基础模型&#xff0c;使其在零样…

文生图模型开源之光!ComfyUI - AuraFlow本地部署教程

一、模型介绍 AuraFlow 是唯一一个真正开源的文生图模型&#xff0c;由Fal团队开源&#xff0c;其代码和权重都放在了 FOSS 许可证下。基于 6.8B 参数优化模型架构&#xff0c;采用最大更新参数化技术&#xff0c;还重新标注数据集提升指令遵循质量。在物体空间和色彩上有优势…