当前位置: 首页 > news >正文

MySQL 锁那些事

    • Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?
    • Q2 : 行锁是如何实现的?什么情况下会使用行锁?
    • Q3 : 四种事务隔离形式的行锁有什么不一样?
        • 读未提交
        • 读提交
        • 可重复读
        • 串行
    • Q4 : MySQL 的读写都是怎样加锁的?
    • Q5 : 需要注意什么?

Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?

  1. 全局 - 锁定全局(库)的数据,所有写全部阻塞,只能写.
    • 只有做全库逻辑备份才会用
  2. 表锁 - 锁定一个表的数据,避免数据更新时的并发问题
  3. 行锁 - 锁定某一行/一个区间(间隙)的数据,避免数据更新时的并发问题
    • 行锁是通过索引实现的,如果没有索引,那么将会使用表锁.

Q2 : 行锁是如何实现的?什么情况下会使用行锁?

  • MySQL 如何加表锁:
    • 直接在整个表上加锁,限制全表的读写访问(锁全表)

那么行锁是如何工作的呢?

行锁是通过索引实现的,主要分为两个阶段

  • 二级索引(间隙/临建)加锁并命中数据(主键 id)

    • 加锁方式: 先根据边界条件或者等值条件命中情况决定加锁的范围
      • 没命中: 索引无法命中不存在的 key,但是要避免数据在(事务)执行期间新数据的加入导致数据混乱问题,就会在未命中前后 key 区间加间隙锁,保证执行期间没有数据插入
      • 其他: 如果锁范围查询就会对查询范围进行加锁,在结合刚刚的未命中区间,就是二级索引加锁的区间
    • 作用: 限制区间的数据插入,避免区间内数据的插入导致结果错误问题
  • 主键索引加锁

    • 根据上面二级索引命中的主键 id,对每个 id 的数据行进行加锁
    • 作用: 避免事务执行期间数据被修改

Q3 : 四种事务隔离形式的行锁有什么不一样?

读未提交

有的人说读提交不会显示加锁,我觉得不加锁不科学,不加锁百分百会出现读写并发冲突问题,一定会报错;
但是 MySQL 不会做一个有问题的东西给大家用,那为什么读未提交不会阻塞其他事务,我想只有一个解释锁的生命周期(持有时间)

  • 锁持有时间是任务结束(并不是事务结束),不会加间隙锁
  • 优点: 锁持有时间短,对其他事务影响小
  • 缺点: 脏读问题
读提交
  • 锁的生命周期锁整个事务,不会加间隙锁
  • 优点: 没有间隙锁,对其他事务(在间隙的数据插入)性能影响小
  • 缺点: 数据幻读问题
    (思考: 有锁的话读提交还有不可重复读的问题吗?)
可重复读
  • 锁的生命周期锁整个事务,会加间隙锁
  • 优点: 避免数据幻读
  • 缺点: 略微降低数据写入的性能
串行
  • 最严格的隔离级别,它通过加 范围锁 或 表锁 来确保事务之间没有冲突,所有读取的数据都必须是其他事务已提交的数据。
  • 由于避免了幻读,它会在 查询范围 上加 间隙锁 或 表锁,防止其他事务在查询范围内插入或修改数据。
    (我觉得串行不需要锁,单线程的执行事务就没有并发问题了呀,为什么需要锁?搞不懂)

Q4 : MySQL 的读写都是怎样加锁的?

  • MySQL 的普通查询是不会加锁的,而是通过 mvcc 去进行多版本并发控制

  • MySQL 写是通过锁控制的,具体锁的程度根据索引情况与隔离程度而定

Q5 : 需要注意什么?

  • 没有索引锁全表

行锁只有索引的条件下才会生效,没有索引会锁全表,造成其他线程阻塞,连接大量堆积,严重影响性能.

没有索引的查询与更新数据在并发情况下表现更差.

索引不仅会减少磁盘 io 的次数加快数据的查询,还可以提高并发情况下的读写性能表现.

参考:
https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E5%94%AF%E4%B8%80%E7%B4%A2%E5%BC%95%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2
https://juejin.cn/post/6931752749545553933

https://blog.csdn.net/weixin_43994761/article/details/132250415
https://blog.unclezs.com/pages/180d74/#%E7%AE%80%E4%BB%8B

相关文章:

MySQL 锁那些事

Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?Q2 : 行锁是如何实现的?什么情况下会使用行锁?Q3 : 四种事务隔离形式的行锁有什么不一样?读未提交读提交可重复读串行 Q4 : MySQL 的读写都是怎样加锁的?Q5 : 需要注意什么? Q1 : MySQL有哪些锁,功能是什么,如何项目中使用…...

Linux中常用的基本指令和一些配套的周边知识详解

目录 一些基本指令 一些常用指令 注:配套的周边知识是直接跟在指令的讲解后面的。 补充:(重要) 如何看待这么多指令???记不住怎么办??? 首先,指令不用刻意去记&#xf…...

深入理解Java中的Set集合:特性、用法与常见操作指南

一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①:add(Object o):向Set集合中添加元素,不允许添加重复数据。 ②:size():返回Set集合中的元素个数 ③.remove(Object o): 删除Set集合中的obj对…...

Oracle 使用 sql profile 固定执行计划

测试使用 sql profile 固定执行计划: Oracle 10g之前有outlines,10g之后 sql profile 。如果针对非绑定变量的sql,outlines则效果不佳,不建议使用 。 1、准备测试用表 SQL> create table zzh_ob as select * from dba_objects; SQL> create inde…...

数字电路期末复习

*前言:*写的东西不太全面,更多的是一个复习大纲,让你发现自己有哪些不懂的问题(不懂的地方就去翻书或者问AI),如果能够解决提出的所有问题,那么过期末考一定不是问题。 这里写目录标题 数制和码…...

正则表达式 - 使用总结

正则表达式 - 使用总结 正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许我们通过特定的模式(pattern)来搜索、匹配和操作字符串。在编程、数据分析和文本处理等领域,正则表达式发挥着非常重要的作用。本文将总结正则表达式的基本概念、使用方…...

通过Xshell远程连接wsl2

目录 一、WSL网络原理 二、 下载XShell 三、Ubuntu里配置ssh 1.查看是否已经安装SSH 2.安装SSH 3.修改SSH配置 4.重启ssh 5.查看ip 四、在Xshell中链接电脑 五、设置端口转发 1.设置主机端口映射到wsl2的端口 六、防火墙设置开放8989端口 方式一(推荐): 方式二:…...

【ubuntu】安装OpenSSH服务器

参考:https://blog.csdn.net/fanjufei123456/article/details/139264814 要在Ubuntu上使用SSH连接,需要确保系统上安装并运行了SSH服务器。SSH服务器负责接受来自其他计算机的SSH连接请求,并提供对目标系统的访问权限。 在Ubuntu上,默认情况…...

CESS 的 2024:赋能 AI,塑造去中心化数据基础

2024 年是加密与区块链行业的重要转折之年,行业在技术创新、监管明确和实际应用上取得了显著进展。全球范围内,多个国家相继推出加密货币和区块链技术的监管框架,美国的区块链政策峰会推动了关键议题的讨论,欧洲完成了 MiCA 监管的…...

Redission红锁

目录 一、什么是红锁 二、Redission红锁的使用 一、什么是红锁 Redis 的作者 Salvatore Sanfilippo(又名 antirez)提出的一种基于多个 Redis 实例实现分布式锁的算法。红锁(Redlock)旨在解决单点故障问题,即当使用单…...

使用 CSS 的 `::selection` 伪元素来改变 HTML 文本选中时的背景颜色

定义 ::selection 伪元素: 在你的 CSS 文件中,添加 ::selection 伪元素,并设置 background-color 属性来改变选中文本的背景颜色。 示例代码: ::selection {background-color: yellow; /* 你可以根据需要更改颜色 */color: black…...

Spring Boot AOP日志打印实现

在 Spring Boot 3.1.12 中使用 AOP 实现日志打印&#xff0c;记录前端传入的参数和后端返回的数据&#xff0c;可以按照以下步骤进行&#xff1a; 添加依赖 首先&#xff0c;确保你的 pom.xml 文件中包含了 Spring AOP 的依赖&#xff1a; <dependency><groupId>…...

Windows远程--如何使用IP访问服务器

1.第一步&#xff1a;在本地按下winR打开运行窗口&#xff0c;输入mstsc 打开window自带的远程桌面组件&#xff0c;在打开的窗口内输入公网ip。 2.第二步&#xff1a;输入远程电脑的登录用户名和密码&#xff0c;即可成功建立连接。...

vscode中设置默认格式化工具pretter

1. 安装 Prettier 插件 打开 VSCode 的扩展市场&#xff08;快捷键 CtrlShiftX 或点击左侧的扩展图标&#xff09;。 搜索并安装 Prettier - Code formatter 插件。 2. 设置 VSCode 使用 Prettier 格式化代码 打开 VSCode 的设置&#xff08;快捷键 Ctrl, 或点击右下角齿轮图标…...

Hadoop、Flink、Spark和Kafka

Hadoop、Flink、Spark和Kafka是大数据处理领域中的四个重要工具&#xff0c;它们在架构、数据处理方式以及性能等方面都存在区别。以下是具体分析&#xff1a; 架构 Hadoop&#xff1a;Hadoop的核心是HDFS&#xff08;Hadoop Distributed File System&#xff09;和MapReduce编…...

APP自动化测试元素定位及隐式等待

元素定位是UI自动化测试中最关键的一步&#xff0c;假如在自动化测试中没有定位到页面中素&#xff0c;也就无法完成对页面的测试操作。那么&#xff0c;我们在自动化测试中如何定位到是要部面元素呢&#xff1f; 下面聊一聊用 Appium 定位元素的方式。 定位页面元素有很多种…...

Element plus 的 upload 组件实现自定义上传

Element Plus 是一个基于 Vue 3 的 UI 组件库&#xff0c;提供了许多常用的 UI 组件。其中&#xff0c;Upload 组件用于文件上传功能。如果你想实现自定义上传逻辑&#xff0c;可以通过 before-upload 和 http-request 属性来实现。 以下是一个简单的示例&#xff0c;展示如何…...

力扣-数据结构-10【算法学习day.81】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…...

WPF的一些控件的触发事件记录

<c1:C1ComboBox Width"230" ItemsSource"{Binding ReplaceWayList}" Style"{StaticResource ListSearch-C1ComboBox}" SelectedValueChanged"C1ComboBox_SelectedValueChanged"&#xff0c; 下拉框事件&#xff0c;值改变事件&a…...

C# 设计模式(创建型模式):建造者模式

C# 设计模式&#xff08;创建型模式&#xff09;&#xff1a;建造者模式 引言 在软件开发中&#xff0c;创建型设计模式主要关注对象的创建方式&#xff0c;其中建造者模式&#xff08;Builder Pattern&#xff09;是非常重要的一种。建造者模式通过一步一步构建一个复杂对象…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...