mysql锁机制以及隔离级别下保证并发安全的方式

news2025/2/4 10:47:38

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

mysql锁机制以及隔离级别下保证并发安全的方式

  • 多事务并发执行可能出现的问题
  • mysql有那些锁
    • 全局锁
    • 表级锁
    • 行锁
  • 在不同的隔离级别下mysql保证并发安全的方式
    • RU隔离级别
    • RC隔离级别
    • RR隔离级别
    • Serializable隔离级别
  • 面试:什么情况下会产生死锁?


多事务并发执行可能出现的问题

脏写:多个事务同时对一行数据进行修改,导致一个事务修改的数据被另一方覆盖。如下图,如果事务B想要扣减三百余额,而事务A在事务B执行之后将余额设置为1000,就导致事务B的修改被事务A覆盖

在这里插入图片描述

脏读:事务B读取了事务A修改后但未提交的事务,而事务A由于业务进行数据回滚,造成了数据不一致的问题。如下图
在这里插入图片描述
不可重复读:事务B多次读取数据,而在多次读取数据之间事务A修改了数据并进行了提交,导致事务B多次读取数据不同,造成了数据不一致问题。如下图。
在这里插入图片描述
幻读:事务B进行多次查询,而在多次查询期间由于事务A插入新的数据,导致事务B多次查询数据不同,造成数据不一致问题。如下图。
在这里插入图片描述

对于以上由于并发事务导致的线程安全问题,mysql使用了锁机制和MVCC解决这些问题,关于MVCC如何实现以及作用我在这篇文章中有介绍。我们先来讲讲mysql的锁机制

mysql有那些锁

按照锁的粒度来分,mysql的锁可以分为全局锁、表锁和行锁。
按照锁的功能来分,可以分为共享锁和排他锁。

全局锁

对整个数据库加锁,mysql提高了加全局读锁的命令:Flush tables with read lock (FTWRL),加全局读锁之后,mysql只允许读数据的操作,数据的更新操作以及数据库表的结构定义以及修改操作会被阻塞。

表级锁

表级锁包括表锁、元数据锁和意向锁。
表锁:表锁包括表写锁和表读锁。
表读锁:当事务获取表读锁后,会阻塞其他事务获取表写锁,但是其他事务可以再次获取表读锁。
表写锁:当事务获取表写锁后,会阻塞其他事务获取表写锁和表读锁。
也就是表读锁可以被多个事务所持有,而表写锁只能被一个事务所持有,并且表写锁和表读锁会相互阻塞。
元数据锁:元数据锁包括元数据写锁和元数据读锁。主要针对对数据库表结构进行查询修改时进行加锁。
元数据读锁:当查询数据库表结构信息时,对表加锁,会阻塞元数据写锁
元数据写锁:当对数据库表的结构进行修改时,对表加锁,会阻塞元数据读锁
意向锁:当我们想要对整个表的数据进行修改时,需要获取表写锁,而表写锁和行锁肯定时阻塞的,因此需要检查是否含有行锁,如果需要遍历每一行数据,毫无疑问很浪费时间,因此引入了意向锁。
当数据获取行锁后,会添加意向锁,如果对整个表进行修改而获取表写锁,只需要判断有无意向锁即可。

行锁

行锁包括记录锁、间隙锁和临键锁。它们都是排他锁,会相互阻塞。
记录锁:对单个数据行进行加锁。当修一行数据时需要获取记录锁。
间隙锁:当修改一个范围内的数据或者对它们进行当前读时,会加间隙锁。
临键锁:是记录锁和间隙锁的结合,当执行写操作时都会获取临建锁,而临建锁则会根据实际情况退化为记录锁和间隙锁。

在不同的隔离级别下mysql保证并发安全的方式

RU隔离级别

在Read Uncommitted隔离级别下,解决了脏写的问题,但是会发生脏读、不可重复读、幻读的问题
解决方案:通过写操作加排他锁,使得并发写操作相互阻塞来防止脏写。

RC隔离级别

在Read Committed隔离级别下,解决了脏写、脏读的问题,但是会发生不可重复读、幻读的问题
解决方案:通过MVCC机制解决了脏读的问题,对写操作加排他锁保证了脏写的问问题,但是由于每一次快照读都会生成一个Read View会导致不可重复读和幻读的问题。

RR隔离级别

在Repeatable Read隔离级别下,解决了脏写、脏读、不可重复读的问题,但是会发生幻读的问题
解决方案:通过MVCC机制以及一个事务最多会生成一个快照解决了脏读、不可重复读的问题,对写操作加排他锁解决了脏写的问题,但是在特定情况下仍然会导致幻读的问题。

Serializable隔离级别

在Serializable隔离级别下,解决了脏写、脏读、不可重复读、幻读的问题,但是其性能极低
解决方案:所有写操作加排他锁,读操作加共享锁,解决了脏写、脏读、不可重复读、幻读的问题,但是mysql的读写操作会相互阻塞,性能很低,mysql默认使用RR隔离级别。

面试:什么情况下会产生死锁?

在这里插入图片描述
如上图所示,线程A对id=10的数据行加了记录锁,而线程B对id=5的数据行加了记录锁,线程A需要获取id=5的行记录锁,而线程B需要获取id=10的行记录锁,它们之间相互阻塞,而锁只有在事务提交或者回滚之后才会释放,它们之间相互等到,互相占用了对方的所需的资源,形成了死锁。

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

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

相关文章

qwenvl 以及qwenvl 2 模型架构理解

qwenvl 模型理解: 参考资料: https://qwenlm.github.io/zh/blog/qwen2-vl/ https://github.com/QwenLM/Qwen2-VL?tabreadme-ov-file https://qwenlm.github.io/zh/blog/qwen2-vl/ 论文: qwenvl https://arxiv.org/abs/2308.12966 Qwen2-VL …

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及,即便是零编程基础或基础薄弱的用户,也可以借助AI完成许多技术任务。然而,要高效地使用AI完成编程任务,关键在于如何清晰表达需求,并逐步引导AI实现目标。 在本文中,我们将通过开发…

AI生成视频字幕--VideoCaptioner/卡卡字幕助手

github: https://github.com/WEIFENG2333/VideoCaptioner 123云盘:https://www.123865.com/s/inrnjv-1sk6H提取码:4455 B站教程:https://www.bilibili.com/video/BV1giBqYtEqG?vd_source8e73ffa42accf9446f3cb7fddc85b38c 优点:1.免费&am…

嵌入式单片机窗口看门狗控制与实现

窗口看门狗 注意:WWDG外设没有独立的时钟源,而是挂载在APB1总线下,APB1总线外设时钟为42MHZ。 了解WWDG外设的使用流程,可以参考stm32f4xx_wwdg.c的开头注释,具体流程如下图所示

从 ELK Stack 到简单 — Elastic Cloud Serverless 上的 Elastic 可观察性

作者:来自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式发布 — 一款完全托管的可观察性解决方案。 随着组织规模的扩大,一个能够处理分布式云环境的复杂性并提供实时洞察的可观察性解决方…

【教程】通过Docker运行AnythingLLM

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 官方教程:Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件: sudo mkdir /app su…

RabbitMQ基础篇之快速入门

文章目录 一、目标需求二、RabbitMQ 控制台操作步骤1.创建队列2.交换机概述3.向交换机发送消息4.结果分析5.消息丢失原因 三、绑定交换机与队列四、测试消息发送五、消息查看六、结论 一、目标需求 新建队列:创建 hello.queue1 和 hello.queue2 两个队列。消息发送…

Lottie动画源码解析

Lottie是一个很成熟的开源动画框架,它支持直接使用从AE导出的动画文件,在不同平台均可快速使用,大大减轻了程序员的工作量,也让复杂的动画成为可能。该动画文件使用Json格式来描述内容,可以大大缩减文件的体积。在Andr…

手机发烫怎么解决?

在当今这个智能手机不离手的时代,手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感,长期过热还可能损害手机硬件、缩短电池寿命,甚至引发安全隐患。不过别担心,下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…

win10、win11-鼠标右键还原、暂停更新

系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx,打开powershell管理员,输入以下命令,选择1并等待 irm https://get.activated.win | iex参考:https://www.bilibili.com/video/BV1TN411M72J/?sp…

Android 学习小记1

目录 先介绍一下Android Studio 看看常见的模板 1. No Activity 2. Empty Activity 3. Gemini API Starter 4. Basic View Activity 5. Bottom Navigation Activity 6. Empty Views Activity 7. Navigation Drawer Views Activity 8. Responsive Views Activity 9. G…

uniapp使用ucharts组件

1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…

一、Hadoop概述

文章目录 一、Hadoop是什么二、Hadoop发展历史三、Hadoop三大发行版本1. Apache Hadoop2. Cloudera Hadoop3. Hortonworks Hadoop 四、Hadoop优势1. 高可靠性2. 高扩展性3. 高效性4. 高容错性 五、Hadoop 组成1. Hadoop1.x、2.x、3.x区别2. HDFS 架构概述3. YARN 架构概述4. Ma…

深度学习笔记(9)——神经网络和反向传播

神经网络和反向传播 神经网络架构: 更多的神经元,更大的模型容量,使用更强的正则化进行约束。 神经网络的分层计算 f W 2 m a x ( 0 , W 1 x b 1 ) b 2 fW_2max(0,W_1xb_1)b_2 fW2​max(0,W1​xb1​)b2​,其中max函数体现了非线性,如果想要加深网络的层次,必须…

大模型辅助测试的正确打开方式?

测试的基本目的之一,是对被测对象进行质量评估。换言之,是要提供关于被测对象质量的“确定性”。因此,我们很忌讳在测试设计中引入“不确定性”,比如采用不可靠的测试工具、自动化测试代码逻辑复杂易错、测试选择假设过于主观等等…

ipad如何直连主机(Moonlight Sunshine)

Windows 被连接主机(Windows) 要使用的话需要固定ip,不然ip会换来换去,固定ip方法本人博客有记载Github下载Sunshine Sunshine下载地址除了安装路径需要改一下,其他一路点安装完成后会打开Sunshine的Web UI&#xff…

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题,所以准备使用sentinel来限流。平台依赖里面已经引入了,之前也测试过,把sentinel关于nacos的配置加上后,启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…

紫光同创-盘古200pro+开发板

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 一、开发系统介绍 开发系统概述 MES2L676-200HP 开发板采用紫光同创 logos2 系列 FPGA,型号:…

Vue开发环境搭建上篇:安装NVM和NPM(cpnm、pnpm)

文章目录 引言I 安装NVM1.1 Windows系统安装NVM,实现Node.js多版本管理1.2 配置下载镜像1.3 NVM常用操作命令II NPM永久使用淘宝源安装 cnpm安装pnpm【推荐】see also: vscode常用插件引言 淘宝镜像:http://npm.taobao.org 和 http://registry.npm.taobao.org 已在 2022.06.3…