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

MySQL学习3之锁机制

一、什么是锁粒度?

锁粒度(Lock Granularity)是指在数据库中锁定数据资源的最小单位。锁粒度决定了锁定操作的范围,即锁定的是整个数据库、整个表、表中的某个分区、表中的某一页还是表中的某一行。

在MySQL中常见的锁粒度有:表级锁、行级锁、页级锁。

因为更细粒度的锁可以允许更多的并发事务访问不同的数据资源,所以锁粒度越小,锁的竞争越小,并发性能越高,锁管理的开销越大。合理选择锁粒度可以帮助平衡锁的竞争和并发性能,从而提高数据库的整体性能。

二、MySQL中常见的锁粒度类型

2.1、表级锁:

  • 描述:锁定整个表,阻止其他事务访问该表。
  • 用途:适用于需要锁定整个表的场景,例如 MyISAM 和 MEMORY 存储引擎。
  • 特点:锁的竞争最小,但并发性能较低。

2.2、行级锁:

  • 描述:锁定特定的行,而不是整个表。
  • 用途:适用于需要锁定单个行的场景,以减少锁的竞争。
  • 特点:锁的竞争较大,但并发性能较高。

2.3、页级锁:

  • 描述:锁定数据页,而不是行或整个表。
  • 用途:适用于需要锁定数据页的场景,例如在某些存储引擎中用于索引组织表。
  • 特点:锁的竞争和并发性能介于表级锁和行级锁之间。

一般来说,如果事务主要涉及读操作,可以选择较大的锁粒度(如表级锁),以减少锁的管理开销。如果事务涉及大量写操作,并且写操作通常是针对少量行的,那么使用较小的锁粒度(如行级锁)可以提高并发性能。

三、如何设置锁粒度

在 MySQL 中,锁粒度通常是由存储引擎自动管理的。不同的存储引擎支持不同类型的锁。通常,不需要显式设置锁粒度,通过选择合适的存储引擎和事务隔离级别来间接控制锁的行为。

3.1、选择存储引擎

  • InnoDB 存储引擎:默认支持行级锁,适用于需要高并发和事务安全的场景。
  • MyISAM 存储引擎:支持表级锁,适用于读多写少的场景

3.2、选择事务隔离级别

  • READ UNCOMMITTED:最低的隔离级别,不使用行级锁,可能导致脏读。
  • READ COMMITTED:使用行级锁,允许并发读取,但可能导致不可重复读。
  • REPEATABLE READ(默认):使用行级锁,禁止并发读取,避免不可重复读。
  • SERIALIZABLE:最高隔离级别,使用表级锁,确保事务串行执行。

一旦表创建完成,锁粒度就已经确定。如果需要更改锁粒度,你需要重新创建表或使用不同的存储引擎。

四、锁模式

4.1、共享锁(Shared Locks,S锁)

  • 描述:允许多个事务同时读取数据,但阻止其他事务写入数据。
  • 用途:适用于读取数据的场景。
  • 示例:在 InnoDB 中,SELECT ... LOCK IN SHARE MODE 会获取共享锁。

4.2、排他锁(Exclusive Locks,X锁)

  • 描述:阻止其他事务读取或写入数据。
  • 用途:适用于写入数据的场景。
  • 示例:在 InnoDB 中,SELECT ... FOR UPDATE 会获取排他锁。

4.3、意向锁(Intention Locks)

  • 描述:意向锁是一种特殊的锁,用于指示事务打算获取的锁的类型。
  • 用途:用于与其他锁协调,以减少死锁的可能性。
  • 示例:意向共享锁(IS)表示事务打算获取共享锁,意向排他锁(IX)表示事务打算获取排他锁。

五、锁等待

5.1、什么是锁等待

锁等待(Lock Wait)是指在数据库事务处理中,当一个事务请求锁定某个资源(如行、页或表)时,如果该资源已经被另一个事务锁定,则请求锁定的事务将进入等待状态,直到资源解锁为止。这种等待状态称为锁等待。

5.2、锁等待的影响

  • 并发性能:锁等待可能会降低系统的并发性能,因为等待的事务无法继续执行。
  • 死锁:如果多个事务互相等待对方释放锁,则可能导致死锁。

5.3、锁等待的检测与解决

  • InnoDB 存储引擎:InnoDB 存储引擎会自动检测锁等待情况,并在必要时报告锁等待状态。
  • 等待超时:可以通过设置 innodb_lock_wait_timeout 参数来限制等待锁的时间,超过该时间后事务将回滚。
  • 死锁检测:MySQL 会自动检测死锁,并回滚其中一个事务以解决死锁。

5.4、锁等待的预防

  • 合理的事务设计:尽量减少事务的持续时间和锁定资源的数量。
  • 事务隔离级别:选择合适的事务隔离级别以减少锁等待。
  • 锁的粒度:使用更细粒度的锁(如行级锁)可以减少锁等待的机会。

六、死锁检测与处理

在执行需要锁定数据的操作时,MySQL 会自动获取相应的锁。在事务提交或回滚时,MySQL 会自动释放所有锁定的数据资源。

在 MySQL 中,死锁是指两个或多个事务互相等待对方释放锁,从而形成循环等待的情况。当这种情况发生时,MySQL 会自动检测并解决死锁问题

MySQL 会检测死锁情况,当发现死锁时,会自动回滚其中一个事务以解决死锁。MySQL 通常会选择回滚成本较低的事务,以减少对系统的影响。

6.1、死锁检测

MySQL 的 InnoDB 存储引擎会自动检测死锁。InnoDB 使用了一个称为“等待图”的数据结构来检测死锁。每当事务请求一个新的锁时,InnoDB 会在等待图中添加一条边,表示事务正在等待锁。如果等待图中形成了一个环路,则表明存在死锁。

6.2、死锁处理

当检测到死锁时,MySQL 会采取措施来解决死锁。通常的做法是选择一个事务进行回滚,以打破循环等待的情况。InnoDB 通常会选择回滚成本较低(基于事务的大小、回滚成本和优先级等因素确定)的事务,以减少对系统的影响。

相关文章:

MySQL学习3之锁机制

一、什么是锁粒度? 锁粒度(Lock Granularity)是指在数据库中锁定数据资源的最小单位。锁粒度决定了锁定操作的范围,即锁定的是整个数据库、整个表、表中的某个分区、表中的某一页还是表中的某一行。 在MySQL中常见的锁粒度有&am…...

2004-2023年上市公司过度负债数据(含原始数据+计算结果)

2004-2023年上市公司过度负债数据(含原始数据计算结果) 1、时间:2004-2023年 2、来源:上市公司年报 3、指标:证券代码、证券简称、统计截止日期、是否剔除ST或*ST股、是否剔除当年新上市、已经退市或被暂停退市的公…...

[机器学习]--KNN算法(K邻近算法)

KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…...

跨平台控制神器Escrcpy,您的智能生活助手

Escrcpy 是一款基于 Scrcpy 开发的图形化安卓手机投屏控制软件,它允许用户将 Android 手机屏幕实时镜像到电脑上,并使用电脑的鼠标和键盘直接操作手机,实现了无线且高效的操控。这款软件是免费开源的,支持跨平台使用,包…...

AR 眼镜之-开关机定制-实现方案

目录 📂 前言 AR 眼镜系统版本 开关机定制 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)开机 Logo 2)开机音效 3)开机动画 4)关机动画 5)关机弹窗 2. 💠 开机 Logo…...

论文阅读-Transformer Layers as Painters

1. 摘要 尽管大语言模型现在已经被广泛的应用于各种任务,但是目前对其并没有一个很好的认知。为了弄清楚删除和重组预训练模型不同层的影响,本文设计了一系列的实验。通过实验表明,预训练语言模型中的lower和final layers与中间层分布不一致…...

【STL】vector模拟实现

vector引入 ​​ vector的实现主要依靠三个成员变量:start,finish和end_of_storage 其中: [start]指向容器中的起始位置 [finish]指向容器中最后一个有效数据的下一个位置 [end_of_storage]指向容器中现有容量的位置 通过这三个指针,就使得vector的size…...

静态成员static关键字

定义: 静态成员在C类中是一个重要的概念,它包括静态成员变量和静态成员函数。 静态成员变量 1定义:静态成员变量是类的所有对象共享的变量。与普通成员变量相比,无论创建了多少个类的实 例,静态成员变量只有一份拷贝…...

本地项目git同步到线上

将本地创建的项目同步到你的 GitHub 账号线上仓库,可以按照以下步骤进行操作: 1. 在 GitHub 上创建一个新仓库 登录你的 GitHub 账号。点击右上角的加号(),然后选择 New repository。填写仓库的名称、描述等信息。选…...

Allegro如何导入DXF结构文件并生成板框(1)?

在用Allegro进行PCB设计时,需要导入DXF结构文件,由此来生成PCB的板框。 本节先讲Allegro如何导入DXF结构文件?下节讲如何利用导入的DXF结构文件生成OUTLINE板框。 Allegro如何导入DXF结构文件并生成板框(2)?-CSDN博客 详细操作方法如下: 1、选择菜单栏File 选择Import…...

Word密码忘记怎么办?三个密码找回工具帮你轻松找回密码

在工作当中,为了保护文档内容的安全,我们时常会设置密码。但有时会因为长时间未打开而忘记了密码,导致word文档无法打开。面对这种情况,我们该怎么办呢?下面小编就将给大家带来3个实用的密码找回工具,帮助大…...

使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例

使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例项目是一个很好的方式来学习如何结合高级框架进行开发。ABP 框架提供了强大的模块化和分层架构,适合构建复杂的企业级应用程序。 以下是一个使用 ABP 框架的完整示例项目,它展示了如何创建一个包含 …...

WPF图表控件库

LiveCharts: LiveCharts2预览版、内存管理不是很好,长时间持续更新的情况下,内存溢出,慎用 数据加载量不能太大(1000点左右 开始卡) 第一步:下载LiveChart NuGet包 第二步:引用&a…...

JAVA-WEB资源配置

用JAVA进行编写WEB项目时,我们一般需要对WEB进行统一配置,例如制定拦截路径、页面解析器、跨域配置、fastjson报文解析、文件上传大小配置等。 Getter Setter Configuration public class WebConfiguration extends WebMvcConfigurationSupport {priva…...

分享一个基于微信小程序的宠物服务中心的设计与实现(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...

时空自回归模型(STAR)及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 附录 数据预处理 生成时空权重矩阵 一、引言 时空自回归模型(Spatial-Temporal Autoregressive Model,简称 STAR)在分析具有时空特征的数…...

SpringCloud集成XXL-JOB定时任务

项目场景: XXL-JOB是一个分布式任务调度平台,它能够帮助开发者轻松地实现任务的定时执行、任务调度和任务管理 接入步骤 下载XXL-JOB压缩包 链接: xxl-job XXL-JOB做为子模块 将压缩包解压,项目二级新建目录xxl-job,放入目录…...

《财经网》揭秘格行销量第一的秘籍!年销百万台,获千万级网红推荐!

随身WiFi已成为当下网红爆款神器,却为何频频陷入用户信任的危机?低价诱惑背后的限速陷阱、流量虚标,市场看似繁华,实则暗藏玄机。然而,就在这片混沌与质疑交织的迷雾中,一个品牌悄然崛起,以惊人…...

Java 中 Integer 类的比较行为

在 Java 中,Integer 类的比较行为有其特定的规则,这些规则涉及到缓存和对象比较。让我们分析一下你提供的代码: java public class test2_4 { public static void main(String[] args){Integer a 100;Integer b 100;Integer c 1000;Int…...

C# 通过反射(Reflection)调用不同名泛型方法

在C#中,通过反射调用泛型方法时,如果方法的名称或参数类型有所不同,那么你需要根据具体的情况来构造合适的MethodInfo对象。由于你提到的是调用“不同名”的泛型方法,这意味着你需要首先确定具体要调用的方法名,然后再…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...