MYSQL-浅谈MYSQL加锁机制、锁分类

news/2025/3/12 0:35:37/文章来源:https://www.cnblogs.com/skystrive/p/18733789

MYSQL-浅谈MYSQL加锁机制、锁分类

文章转载自:https://cloud.tencent.com/developer/article/2431018

一、概述

1.1、MySQL锁的由来

客户端发往MySQL的一条条SQL语句,实际上都可以理解成一个个单独的事务(一条SQL语句就是一个事务),而事务是基于数据库连接的,每个数据库连接在MySQL中,又会用到一条工作线程来维护,也就意味着一个事务的执行。本质上就是一条工作线程在执行,当出现多个事务同时执行,这种情况则被称之为并发事务,所谓的并发事务也就是指多条线程并发执行。

多线程并发执行自然就会出现问题,也就是MySQL常见的并发事务四大问题 —— 脏写、脏读、不可重复读、幻读这些问题。对于这些问题又可以通过调整事务的隔离级别来避免,那为什么调整事务的隔离级别后能避免这些问题的产生?这是因为不同的隔离级别中,工作线程执行SQL语句时,用的锁粒度、类型不同。

1.2、锁定义

由以上可知,数据库的锁机制本身是为了解决并发事务带来的问题而诞生的,主要是确保数据库中,多条工作线程并行执行时的数据安全性。

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤为重要,也更复杂。

1.3、锁分类

数据库的锁机制与索引机制类似,都是由存储引擎负责实现的,这也就意味着不同的存储引擎、支持的锁也并不同,这里指不同的引擎实现的锁粒度不同。但除了从锁粒度来分锁之外,锁也可以从其他的维度来划分,因此也会有很多关于锁的名词,下面简单梳理以下MySQL的锁体系:

以锁粒度的维度划分:

  1. 全局锁:锁定数据库中的所有表。加上全局锁之后,整个数据库只能允许读。不允许做任何写操作
  2. 表级锁:每次操作锁住整张表。主要分三类
  • 表锁(分为共享读锁 read lock、表独占写锁 write lock)
  • 元数据锁(meta data lock,MDL):基于表的元数据加锁,枷锁后整张表不允许其他事务操作,这里的元数据可以简单理解为一张表的表结构
  • 意向锁(分为意向共享锁、意向排他锁):这个是InnonDB引擎中为了支持多粒度的锁,为了兼容行锁、表锁而设计的,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查
  1. 行级锁:每次操作锁住对应的行数据。主要分为三类:
  • 记录锁/Record锁:也就是行锁,一条记录和一行数据是同一个意思,防止其他事务对此进行update和delete,在RC、RR隔离级别下都支持
  • 间隙锁/Gap锁:锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,从而产生幻读。在RR隔离级别下都支持
  • 临键锁/Next-Key锁:间隙锁的升级版,同时具备记录锁+间隙锁的功能,在RR隔离级别下支持

以互斥性的角度划分:

  1. 共享锁/S锁:不同事务之间不会互相排斥、可以同时获取锁
  2. 排他锁/X锁:不同事务之间会互相排斥、同时只允许一个事务获取到锁
  3. 共享排他锁/SX锁:MYSQL5.7版本引入的锁,只要是解决SMO带来的问题

以操作类型的维度划分:

  1. 读锁:查询数据时使用的锁
  2. 写锁:执行插入、删除、修改DDL语句时使用的锁

以加锁方式的维度划分:

  1. 显示锁:编写SQL语句时,手动指定加锁的粒度
  2. 隐示锁:执行SQL语句时,根据隔离级别自动为SQL操作加锁

以思想的维度划分:

  1. 乐观锁:每次执行都会认为自己成功,因此先尝试执行,失败后在获取锁
  2. 悲观锁:每次执行都认为自己无法成功,因此会先获得锁,然后再执行

二、共享锁与排他锁

2.1、共享锁(S锁)

定义:一个事务已获取了共享锁,当另一个事务尝试对具备共享锁的数据进行读操作时,可以正常读;进行写操作时,会被共享锁排斥。

共享锁的意思很简单,也就是不同事物之间不会排斥,可以同时获取锁并执行。但这里所谓的不会排斥,仅仅是指不会排斥其他事务来读取数据,但当其他事务尝试写数据时,就会出现排斥性。举个例子简单理解:

-- 窗口1:
-- 开启一个事务
begin;
-- 获取共享锁并查询 id=2 的数据 这里的“lock in share mode”就是加共享锁操作
select * from bank_balance where id=2 lock in share mode;-- 窗口2:
-- 开启一个事务
begin;
-- 获取共享锁并查询 id=2 的数据
select * from bank_balance where id=2 lock in share mode;-- 尝试修改id=2的数据
update bank_balance set balance=230 where id=2;

image
image

当窗口1获取了共享锁,窗口2执行查询/读操作时,可以获取共享锁正常读,但当窗口2执行修改/写操作时未执行成功

当窗口1事务A提交(commit)后,窗口2事务B的写操作才能继续往下执行

由上可见,一个事务已获取共享锁,当另一个事务尝试对具备共享锁的数据进行读操作时,可正常读;进行写操作时,会被共享锁排斥。因此从这个实现中可以得知:共享锁具备排他性,会排斥其他尝试写的线程,当有线程尝试修改同一数据时会陷入阻塞,直至持有共享锁的事务结束以后才能继续执行

2.2、排他锁(X锁)

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

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

相关文章

关于外网访问录像机/摄像头的相关设置

概述 直接通过SSH部署穿透程序这是最理想的方式,通常摄像头系统都是有SSH功能的,但是获取最终可以部署程序的SSH功能,还需从官方客服那里获取一次认证码. 如果无法获取,则需要一台和摄像头在同一个局域网的中转的电脑或者可以部署程序的路由器. 方案1——SSH部署穿透程序 开启S…

无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本地AI Agent

一、天价邀请码VS开源革命:打工人今夜无眠 昨夜科技圈被两个关键词刷屏:​Manus激活码炒至5万元5,7,​GitHub神秘项目OpenManus突然开源6,7。这场戏剧性对决的背后,是一场关于「AI生产力特权」的终极博弈。 ▍Manus的火爆与困局​现象级产品:演示视频中自主分析股票、筛选…

2025年每个小型企业都应该使用的强大AI提示

2025年每个小型企业都应该使用的强大AI提示 作者:Alexander Stahl在2025年,大型语言模型(LLM)已经成为推动业务增长和提升效率的关键工具。然而,令人惊讶的是,许多中小型企业(SME)仍未充分利用这项技术。而那些战略性地使用AI驱动应用的企业,已经在各自的市场中获得了…

震惊!AI 编程竟然让程序员 “失业” 了?真相让人意外

在科技飞速发展的当下,AI 编程的异军突起无疑成为了整个编程领域乃至社会各界热议的焦点。 去年,全球首个AI程序员Devin横空出世,不仅能独立完成代码开发、修复Bug,甚至能通过阅读技术文档自主学习新技能。这一消息引发轩然大波。一时间,“AI 编程让程序员失业” 的讨论,…

读DAMA数据管理知识体系指南13数据架构类型

读DAMA数据管理知识体系指南13数据架构类型1. 数据存储与操作 1.1. 数据存储与操作包括对存储数据的设计、实施和支持,最大化实现数据资源的价值,贯穿于数据创建/获取到处置的整个生命周期 1.2. 数据库操作支持1.2.1. 主要关注与数据生命周期相关的活动,即从数据库环境的初始…

Acrobat DC v25.001 最新专业版已破,像word一样编辑PDF!

25.001 最新专业版已破,像word一样编辑PDF!在数字化时代,PDF文件以其稳定性和通用性成为了文档交流和存储的热门选择。无论是阅读、编辑、转换还是转曲,大家对PDF文件的操作需求日益增加。因此,一款出色的PDF处理软件不仅要满足多样化的需求,还要通过简洁的界面和强大的功…

VMware ESXi 6.7U3v macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 6.7U3u 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Fujitsu (富士通)、Hitach…

博弈论之海盗分金

海盗分金 2025/3/7 hdu春季训练赛第一期,签到第三题出了一道经典博弈论之海盗分金,这题过了很多人可能大多数都是知道这个的,所以我觉得有必要补补博弈论的一些经典模型 先看看题这题在比赛时出现了很多的疑问我一开始的想法觉的就应该只给最后一个人一个就行的,或者是都不…

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)

比赛链接 博客园原文链接(防盗) 开题情况 还是很吃教训的一场比赛,被博弈论硬控两小时(很好的一个博弈论题),dijkstra被卡map,最终三题。自己不会的东西还是太多了,还得多多练习多多长见识。 1001 - 签到 题如其名,签到题,问给出的字符串第一次出现的位置。点击查看代…

实验1c语言输入输出和简单程序编写

实验任务1 源代码1 #include<stdio.h>2 int main()3 {4 printf(" 0 0\n");5 printf("<H> <H>\n");6 printf("I I I I\n");7 8 9 return 0; 10 } 11 #include<stdio.h> 12 int main() 13 { 14 printf(" 0\n&…

Python代码实现Twikoo评论中的图片显示

利用服务器公网IP和域名,通过简单的Python代码实现Twikoo评论中的图片功能。 由于没有购买和注册图床服务,且没有绑定腾讯云服务,所以只能自行想办法实现Twikoo的评论带图片功能。 想起来之前工作中有利用FastAPI实现过在Streamlit大模型RAG检索对话中的图片显示功能,因此考…

C#/.NET/.NET Core优秀项目和框架2025年2月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附…