mysql 加锁算法 详解

锁分类

从锁的操作划分

  • 共享锁和排他锁
    • 共享锁(读锁)和排他锁(写锁)。
    • 对于更新语句,InnoDB会自动加上排他锁;对于查询语句,如果是快照读,由于MVCC的存在,InnoDB不会加任何锁。
    • 只有共享锁和共享锁不冲突,其他组合的锁都是冲突的。

从锁的粒度划分

  • 全局锁

    • 通过FLUSH TABLES WITH READ LOCK语句,整个数据库处于只读状态,其他线程的增删改或表结构修改操作都会阻塞。
    • 主要应用于全库逻辑备份,确保备份期间数据或表结构不被更新。
  • 表级锁

    • 表锁:通过LOCK TABLES语句对表加锁,会限制其他线程及本线程接下来的读写操作。

    • 元数据锁(MDL)

      • 对表进行操作时自动加上。
      • CRUD操作加MDL读锁;表结构变更操作加MDL写锁。
      • 保证表执行CRUD操作时,防止其他线程对表结构做变更。
    • 意向锁

      • 执行插入、更新、删除操作时,先对表加意向独占锁,再对记录加独占锁。
      • 目的是快速判断表里是否有记录被加锁。
  • 行级锁

    • InnoDB引擎支持,MyISAM引擎不支持。
    • 记录锁:锁住一条记录,有S锁和X锁之分,满足读写互斥、写写互斥。
    • 间隙锁:只存在于可重复读隔离级别,解决幻读现象。
    • Next-Key Lock(临键锁):Record Lock + Gap Lock的组合,锁定一个范围及记录本身。
    • 插入意向锁:某个区间的某个位置的锁。
    • 隐式锁:当前事务不生成锁结构,延迟生成。其他事务根据隐藏字段判断事务是否提交,若提交则自己加锁;若未提交则帮助此事务加锁并等待。

锁与索引的关系

  1. 行锁基于索引实现,锁定范围是索引记录。
  2. 索引的选择影响锁的范围和性能,使用索引可减少锁定行数,提高并发性。
  3. 无索引时,可能退化为表锁,导致大量行被锁定。

插入语句是否会触发间隙锁?

  • 普通INSERT
    • 如果间隙已经有间隙锁,使用插入意向锁,插入后给插入的数据上隐式锁;如果没有,加隐式锁。
  • 唯一约束冲突时的INSERT
    • 如果插入的值在锁定范围内且违反唯一约束,会加临键锁。
    • 示例:事务A锁定了(1, 10],INSERT INTO t (id) VALUES (5);会阻塞,直到事务A提交。

表锁和行锁的作用

  • 表锁的作用
    • 整体控制:控制整个表的并发访问,确保数据完整性和一致性。
    • 粒度大:锁定表时可能影响其他操作,引起锁竞争和性能问题。
    • 适用于大批量操作:适合表重建、大量数据加载等场景。
  • 行锁的作用
    • 细粒度控制:精确控制对表中某行数据的访问,提高并发性能。
    • 减少锁冲突:减少锁竞争,提高并发访问效率。
    • 适用于频繁单行操作:适合订单系统中的订单修改、删除等操作。

加锁算法

读未提交下

  • :如果间隙已经有间隙锁,使用插入意向锁,插入后给插入的数据上隐式锁;如果没有,加隐式锁;如果是二级唯一索引,无论哪个隔离级别,插入新记录时遇到唯一二级索引列重复,加临键锁。
  • :需要获取要删除记录的记录锁,保证删除时其他事务未使用这些数据,并保证删除后其他事务无法操作。
  • :给需要更改的数据上记录锁。
  • :普通SELECT不上锁,直接读最新数据,不管是否提交;SELECT…FOR UPDATESELECT … LOCK IN SHARE MODE会上记录锁,不锁间隙。

读已提交下

  • :同读未提交。
  • :需要获取要删除记录的记录锁,保证删除时其他事务未使用这些数据,并保证删除后其他事务无法操作。
  • :给需要更改的数据上记录锁。
  • :普通SELECT不上锁,通过MVCC找到读取的数据;SELECT…FOR UPDATESELECT … LOCK IN SHARE MODE会上记录锁,不锁间隙。

可重复读下

  • :如果间隙已经有间隙锁,使用插入意向锁,插入后给插入的数据上隐式锁;如果没有,加隐式锁;如果是二级唯一索引,无论哪个隔离级别,插入新记录时遇到唯一二级索引列重复,加临键锁。
  • :使用临键锁,防止其他事务在删除的区间内插入数据。
  • :给需要更改的数据上临键锁。
  • :普通SELECT不上锁,通过MVCC找到读取的数据;SELECT…FOR UPDATESELECT … LOCK IN SHARE MODE会上临键锁,锁间隙。

串行化读下

  • :如果间隙已经有间隙锁,使用插入意向锁,插入后给插入的数据上隐式锁;如果没有,加隐式锁;如果是二级唯一索引,无论哪个隔离级别,插入新记录时遇到唯一二级索引列重复,加临键锁。
  • :使用临键锁,防止其他事务在删除的区间内插入数据。
  • :给需要更改的数据上临键锁。
  • :普通查询自动变为SELECT … LOCK IN SHARE MODE,上临键锁,锁间隙。

锁释放与操作细节

  • 这些锁的释放是在事务提交后释放。
  • 删除操作和更新操作类似,删除本质是修改行记录的逻辑删除标识位。
  • MVCC只有在读已提交和可重复读中才有。
  • 间隙锁只有在可重复读和串行化读中才有。
  • 读已提交相对于读未提交只多了个MVCC,用于解决数据可见性问题,保证读到的是已提交的数据。
  • 可重复读相对于读已提交相当于把记录锁升级为临键锁,解决(大部分)幻读情况。
  • 串行化读相对于可重复读相当于普通读会上锁,解决全部幻读情况。

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

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

相关文章

使用EasyExcel导出带下拉框选项excel模板

使用EasyExcel导出excel模版,表头字段动态生成下拉框选择,并且阻止输入不符合下拉框选项的值,会在表格进行提示。 为了避免excel下拉框选项过多,导致下拉框内容不显示,新建一个sheet页,将下拉框内容存储在…

自动化 UI 测试智能体在 Trae 平台的部署体验

我用Trae 做了一个有意思的Agent 「自动化 UI 测试」。 点击 Trae - AI 原生 IDE 立即复刻,一起来玩吧! 前言 用户界面(UI)作为用户与软件交互的窗口,其质量直接影响用户体验和产品口碑。传统的手动 UI 测试不仅效率…

身份证识别接口功能与应用场景-Android证件识别api集成

数字化信息高速发展的时代,信息的高效处理与精准识别已成为众多行业发展的关键驱动力。针对联网平台身份核验过程中,证件信息手动录入效率低、出错率高、用户体验差等问题推出了身份证识别接口,旨在为各行各业提供高效与便捷的身份核验解决方…

POJ2718-Smallest Difference(穷竭搜索:全排列)

题目描述 给定一些不同的十进制数字,您可以通过选择这些数字的一个非空子集并以某种顺序编写它们来形成一个整数。剩余的数字可以以某种顺序写下来形成第二个整数。除非结果整数为 0,否则整数可能不以数字 0 开头。 例如,如果给定数字 0, 1…

银行账户管理系统-交互系统

这篇博文是对上一篇(银行账户管理系统)的提升,上一篇是基础的学习,这一篇是在上一篇的基础上做的交互系统。Tkinter基础函数知识点点击下面超链接就可以跳转到对应的界面。希望可以帮助到你。这是则篇的框架银行账户管理系统代码解释-CSDN博客介绍。 写文章-CSDN创作中心h…

基于大数据的社会治理与决策支持方案PPT(66页)

大数据引领社会治理新变革 大数据技术的兴起,为社会治理带来了前所未有的变革。它改变了我们认识社会的方式,使得社会治理更加精准、高效。通过大数据融合分析,实现了对社会动态的全面监控和深度挖掘。 构建城市块数据中心 以“社会治理”…

Containerd容器技术

目录 一,containerd概述 1,containerd 概述 2,containerd 的主要功能 1. 容器生命周期管理 2. 与底层基础设施交互 3. 与上层系统集成 3,containerd 的核心特点 1. 轻量级与低资源消耗 2. 标准化与开放性 3. 高性能与稳定…

awk命令详解

Shell AWK 命令详解 一、AWK 简介与基本语法 AWK 是一种强大的文本处理工具,名称来源于其三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。它逐行扫描文件,寻找匹配特定模式的行并执行相应操作。 基本语法结构: awk [选项] 模式 {动作} 文件名…

面试150跳跃游戏

思路 贪心算法,使用变量cover表示当前所能覆盖的最大距离,如果cover大于等于n-1表示能覆盖到,反之则不能 class Solution:def canJump(self, nums: List[int]) -> bool:if not nums:return Falsenlen(nums)cover0for i in range(n):if i…

磁悬浮轴承温度漂移克星:三招实现精准控制

在磁悬浮轴承(Active Magnetic Bearing, AMB)的高性能应用中,位置传感器的精度就是系统的生命线。然而,传感器输出随温度变化产生的漂移(温漂),如同一个潜伏的破坏者,悄然引入测量误…

vue2 使用el-form中el-form-item单独绑定rules不生效问题

我居然在同一个问题在了两次跟头!!!必须记录这个小细节!!! 背景:一个后台的表单校验,表单中需要单独绑定rules,跳转方式后面两个选项都使用的同一个el-form-item&#xf…

利用 AWS MCP 解决区域差异问题:构建统一混合云管理平台

痛点直击: 企业在全球化或混合云部署中,常因不同区域(如 AWS 国际区 vs 中国区)或本地 IDC 与云环境之间的服务差异、配置标准不一、合规要求不同,导致管理复杂、运维低效、部署不一致。AWS Migration and Configurati…

C#.Net筑基-优雅LINQ的查询艺术

Linq(Language Integrated Query,集成查询语言),顾名思义就是用来查询数据的一种语言(可以看作是一组功能、框架特性的集合)。在.NETFramework3.5(大概2007年)引入C#,用统…

HTML炫酷烟花

系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心(双心版)10…

【看到哪里写到哪里】算闰年的(year 3) == 0

【??BUG??】在MYSQL源码里面有一段,算每年的天数。其中用到了两个很有意思的 1)(year & 3) 0 2)(year % 400 0 && year),为什么要 &&year呢? &g…

Redis的渐进式hash和缓存时间戳深入学习

前言 关于redis,可由应用维度、系统维度来进行了解。 如下所示: redis在缓存应用发挥着重要作用,不知道你有没思考过Redis为什么这么快? 1、纯内存访问 为什么内存访问比磁盘访问更快,可参考: 操作系统的…

视频续播功能实现 - 断点续看从前端到 Spring Boot 后端

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…

【工具】Linux 中 find 命令使用教程

find 命令是 Linux 系统中最强大、最灵活的文件搜索工具,其能力远超简单的文件名匹配。掌握 find 能让你在复杂的文件系统中精准定位目标,实现高效的文件管理。 一、命令结构与核心概念 find [起始路径] [选项] [表达式]起始路径:搜索的根目…

0629-

0629 0629操作3. 权限 0629 操作 进入数据库 mysql -uroot -proot123 .use idatabase; select * from customer; 2.select distinct name,idnum from customer; 3.UPDATE customer SET idnum left(MD5(idnum),16); 4. UPDATE customer SET phone CONCAT( LEFT(p…

JVM调优实战 Day 6:JVM性能监控工具实战

【JVM调优实战 Day 6】JVM性能监控工具实战 文章简述 在Java应用的性能优化过程中,JVM性能监控工具是不可或缺的“眼睛”。它们能够帮助开发者实时掌握系统运行状态,识别性能瓶颈,并为后续调优提供数据支撑。本文作为“JVM调优实战”系列的第…