MySQL锁

MySQL锁详解 全局锁:锁定数据库中所有的表。表级锁:每次曹锁锁住整张表。行级锁:每次操作锁住对应的行数据。表级锁,每次锁住的是整张表。锁定粒度较大,发生锁冲突的概率最高,并发度最低。引用在MyIsam,innodb等存储引擎中。对于表级锁,主要分为一下三类:1.表锁2.元数据(meta data lock,MDL)3.意向锁1.全局锁对整个数据库实例加锁,加锁后整个实例就处于只读状态;性能较差,数据逻辑备份时使用2.表级锁操作锁住整张表,锁定粒度大,发生锁冲突的概率高。 阅读详情

在这里插入图片描述

开销加锁速度锁定粒度发生锁冲突的概率并发度是否会出现死锁
表级锁小快大最高最低不会
行级锁大慢小最低最高会

页级锁介于两者之间,会出现死锁

全局锁

对整个数据库实例加锁。
整个库处于只读状态,不能对数据进行增删改,不能有DDL操作。
应用场景:逻辑备份。

注:
物理备份:以磁盘块为单位将数据从主机复制到备机。
逻辑备份:以文件为单位将数据从主机复制到备机。

表级锁

读锁时,其他进程无法对表进行写操作
写锁时,其他进程无法进行读操作

写操作加锁原理:
如果表上没有锁,就在表上加写锁,否则把写锁请求放在写锁队列中
读操作加锁原理:
如果表上没有写锁,就在表上加读锁,否则把锁请求放在读锁队列里

表锁使用一次封锁,在会话开始的地方使用 lock 命令将后面所有要用到的表加上锁,在锁释放之前,我们只能访问这些加锁的表,不能访问其他的表,最后通过 unlock tables 释放所有表
锁。

当表数据大部分时间只需要读取时,速度大于级锁和行级锁
有很多group by操作时没有写操作时,速度更快

行级锁

共享锁:
多个事务只能读,不能修改数据。

排他锁:
事务不能在排他锁上加其他锁,InnoDB的增删改都会给涉及的数据加排他锁,select语句不会加任何锁。

MySQL InnoDB引擎自动给增删改语句添加排他锁。

InnoDB行锁是通过给索引项加锁来实现的,只有通过索引条件检索数据时,InnoDB才使用行锁,否则就使用表锁。

缺点:
比表级、页级锁占用更多内存
当表数据被频繁使用时,比页级或表级锁定速度慢,因为需要获得更多锁
如果经常使用group by或者必须扫描整张表,比其他锁慢

记录锁、间隙锁、next-key锁

记录锁会锁住一行的记录
间隙锁或锁住指定区间的记录
next-key锁包含了记录锁和间隙锁,锁定范围也锁定记录本身。

InnoDB默认的加锁方式是next-key锁。

InnoDB自动使用间隙锁的条件:

  • 必须在RR级别下
  • 检索条件必须有索引(没有索引的话,mysql会全表扫描)

解锁规则

  • 使用 UNLOCK TABLES 语句可以显示释放表锁
  • 如果会话在持有表锁的情况下执行 LOCK TABLES 语句,将会释放该会话之前持有的锁
  • 如果会话在持有表锁的情况下执行 START TRANSACTION 或 BEGIN 开启一个事务,将会释放该会话之前持有的锁
  • 如果会话连接断开,将会释放该会话所有的锁

MyISAM的锁机制

MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。所以不会产生死锁,但是由于每操作一条记录就要锁定整个表,导致性能较低,并发不高。

InnoDB的锁机制

意向锁

InnoDB可以同时实现表锁和行锁,使用索引处理数据时使用行锁,否则使用表锁。意向锁是为了保证行锁和表锁不冲突的存在。

例如,事务A修改某表的某行记录,会给该行上X锁,同时给整张表上IX锁;这样后面的事务就不能对该表加表级X锁。

意向锁都是表级锁,因为事务企图想加表级X锁时,检查该表有没有意向锁就行了,就不用检查这张表的每行数据是否都加了意向锁。

行锁的解锁

在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。

所以,如果事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。

InnoDB死锁

死锁发生的情形
  • 一个线程两次申请锁
  • 两个线程互相申请对方的锁,但是对方都不释放锁
死锁检测

针对死锁有两种策略:
一种是超时终止线程,这种时间不好把握,InnoDB默认是50秒
另外一种是自动检测事务死锁,并立刻回滚,然后返回错误。回滚通常选择undo量最小的事务

第二种比较灵活,但是相对会比较花费CPU资源。计算复杂度是n^2,也就是如果有1000个线程,死锁检测的时间复杂度是100万量级。

针对这个问题有一些解决方式:
首先判断这个场景下死锁检测是不是必须的,如果不是必须的可以关闭死锁检测;
或者可以控制并发的数量,例如设置某一行的update并行事务要在10个以下;
或者分摊一下字段压力,例如某个字段记录了公司的总营收,可以将这个字段分摊为10个字段,每次修改其中一个字段的数值即可。

MySQL高级篇之锁 锁这个概念并不是MySQL数据库专有的,而是在多线程执行下,为了保证数据的正确性提出的。其中MySQL事务的隔离性是由锁来实现的。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时,锁机制也为实现MSQL的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。 阅读详情

相关推荐

MySQL查看锁的sql

MySQL查看锁的sql

blood_Z的博客 1万+

Python之MySQL优化(上)

1.索引优化 1.1 索引的分类 分类角度 索引名称 数据结构 B+树,Hash索引,B-Tree 等 存储层面 聚簇索引,非聚簇索引 逻辑层面 主键索引,普通索引,组合索引,唯一索引,空间索引 1.2 回表 假设我们执行一条查询语句 select * from person where ID = 6,因为直接使用的是主键ID查询,所以就会用主键索引,由于主键索引直接关联了整行所有数据,所以,引擎只要执行一次就能查询出结果。 如果执行的sql语句是非主键索引 select * f

baidu_39394442的博客 547

1、STVD和STVP的使用及串口烧写程序教程

文章目录一、前述二、STVD的使用三、STVP的使用1、STVP的作用:2、STVP的使用四、串口烧录程序 一、前述 STVD是意法半导体推出的,可以支持STM8和STM32 而IAR不尽如此,还支持51,MSP430等芯片 软件开发环境:编写程序,调试软件功能,下载固件到单片机中 硬件开发环境:连接外围电路,驱动功能外设,实现电气功能 最终构成一个以STM8系列单片机作为控制核心的应用系统。 MCS-51 一般的开发环境是 IAR 和 Keil STM8 一般的开发环境是 IAR 和 ST

Clichong 1万+

5.sql优化 及 解决锁表的问题

sql解析鱼骨图 执行顺序:from > on > join >where >group by > avg,sum....> having >select >distinct > order by > limit group by--执行顺序从左往右分组 提高GROUP BY 语句的效率, 可以通过将不需要的记...

古月清凨的博客 859

H3C设备VRF配置实战:5步搞定多业务网络隔离(附排错技巧)

本文详细介绍了在H3C设备上配置VRF(虚拟路由转发)实现多业务网络隔离的实战方法。通过五步配置流程,从创建VPN-instance、绑定接口到配置独立路由表,帮助网络工程师在单台设备上构建逻辑隔离的企业级网络,并分享了高级路由配置与常见排错技巧。

gold8的专栏 936

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8626

阿里二面:group by 怎么优化?

01 前言哈喽,我是狗哥,好久不见呀!是的,我又又换了工作。最近一直在面试这几天刚好整理下在面试中被问到有意思的问题,也借此机会跟大家分享下。这家企业的面试官有点意思,一面是个同龄小哥,一起聊了两个小时(聊到我嘴都干了)。二面是个从阿里出来的架构师,视频面试,我做完自我介绍之后,他一开场就问我:对 MySQL 熟悉吗?我一愣,随之意识到这是个坑。他肯定想问我某方面的原理了...

HollisChuang's Blog 1218

反激变压器设计学习笔记

反激变压器匝比感量设计

m0_55419117的博客 5261

导致锁表的原因及解决方法

一、导致锁表的原因 1、锁表发生在insert update 、delete 中; 2、锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite 或者 回滚 或者退出数据库用户; 3、锁表的原因 : 1)、A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表; 2)、锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操...

m0_58871547的博客 2万+

车载测试工程师必备:5分钟搞定CANoe台架搭建(附DBC导入技巧)

本文为车载测试工程师提供快速搭建CANoe测试台架的实用指南,涵盖硬件连接、DBC文件导入及常见报错解决方案。通过详细步骤和高效技巧,帮助工程师在5分钟内完成台架搭建,提升车载测试效率,特别适合紧急功能验证场景。

potato的博客 811

2026华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C++实现。

MISAYAONE的博客 20万+

MySQL表锁,以为自己懂了,结果一个答对的都没有!!!

关于MySQL的如下问题,你能准确的答出来么?(1)和行锁相比,表锁有什么优势?(2)频繁group by的业务,用MyISAM更好,还是InnoDB更好,为什么?(3)...

shenjian58的博客 1236

【项目实战】AES实施应符合NIST密码算法验证程序

AES由美国国家标准与技术研究院(NIST)制定。NIST是负责开发和维护美国政府使用的技术标准的机构,包括加密标准。

奶爸的编程之路,也就一周冷个三天 765

Mysql行锁和表锁

总体来说,加索引可以减少对数据的锁定范围,提高数据库的并发性能,减少锁表延迟。但同时也需要注意索引的选择和使用,因为不合适的索引可能会增加数据库的负担,导致性能下降。在MySQL中,默认情况下,使用的是自动锁定(autocommit)模式,即每个SQL语句都会自动提交一个事务,并释放相应的锁。以上问题涉及到了数据库基本概念、锁的工作原理、性能优化等方面,通过深入理解这些问题,可以更好地应对相关的面试考核。在MySQL中,行锁和表锁是两种常见的锁定机制,它们用于控制对数据库中行或表的并发访问。

on_the_roadZZZ的博客 4980

域适应分类:MCD论文笔记——Maximum Classifier Discrepancy for Unsupervised Domain Adaptation

域适应分类:MCD论文笔记——Maximum Classifier Discrepancy for Unsupervised Domain Adaptation

qq_50001789的博客 1005

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MySQL——锁

MySQL——锁

qq_56086076的博客 1233

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MySQL 锁

详细介绍MySQL的各种锁

qq_35215728的博客 1677

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mysql 加写锁_MySQL中的读锁和写锁

在数据库的锁机制中介绍过,数据的锁主要用来保证数据的一致性的,数据库的锁从锁定的粒度上可以分为表级锁、行级锁和页级锁。在我的博客中重点介绍过MySQL数据库的行级锁。这篇文章主要来介绍一下MySQL数据库中的表级锁。本文提到的读锁和写锁都是MySQL数据库的MyISAM引擎支持的表锁的。而对于行级锁的共享读锁和互斥写锁请阅读MySQL中的共享锁与排他锁。我习惯在描述表锁的时候按照读写来区分,在表述...

weixin_30558777的博客 2329

MYSQL中锁的类型以及如何排查锁

在 MySQL 数据库中,锁机制是维护数据一致性和完整性的关键要素。锁的存在确保了多个事务在并发执行时不会相互干扰,从而避免数据的混乱和不一致。在复杂的数据库环境中,了解 MySQL 中的锁类型及其排查方法显得尤为重要,因为这不仅可以帮助开发人员和数据库管理员优化数据库性能,还能有效地排除故障,提升系统的稳定性。

qq_26733517的博客 2162

mysql 锁

在mysql中使用范围查询的时,如果请求共享锁或者排他锁,InnoDB会给符合条件的已有数据的索引项加锁。悲观锁对于数据库中数据的读写持悲观态度,即在整个数据处理的过程中,他会悲观的认为数据不会保持一致性,所以是会将相应的数据锁定。乐观锁对于数据库的数据的读写持乐观态度,即在整个数据处理的过程中,他会很乐观的认为数据会保持一致性,所以不加锁,而是通过数据版本记录机制实现。需要强调的一点是,InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关 ,在唯一索引列(包括主键列)上不存在临键锁。

随心 1211

MySQL的行锁

背景 自从过年值班就一直在公司读《 MySQL实战45讲》这本书,当时看完了MySQL的全局锁、表级锁还有行锁和间隙锁。其中的行锁和间隙锁迟迟无法理解,最近趁着有空再次阅读了一遍,并且对照了《深入浅出MySQL》,发现对MySQL锁的理解又上了一个台阶,今天就来分享一下MySQL的行锁。 行锁 MySQL的行锁又分为共享锁(S锁)和排他锁(X锁)。 一般普通的select语句,InnoDB不加任何锁,我们称之为快照读 select * from test; 通过加S锁和X锁的select语句或者插入/更

god-jiang的博客 1万+

MySQL锁概述

我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从这一角度来说,锁对于数据库而言就显得尤为重要。 今天就分享下MySQL相关的最全锁,希望你学习后能更好的掌握数据库锁。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特...

zjy1211079133的博客 4314

mysql 表锁 行锁

是针对表中的行记录的锁定机制,允许事务对表中的某行记录进行独占性操作,其他事务可以同时对其他行进行操作。它会锁定被修改的行,确保其他事务不能同时修改同一行,而允许其他事务并发地修改不相关的行。例如,如果一个用户想要取消订单,数据库会锁定该用户的订单行,以确保其他事务不能同时修改同一行,这样可以避免出现订单状态同时被多个事务修改的问题。操作时,会尽可能地使用行级锁,以提高并发性能,并避免对整个表进行锁定,但具体的锁定方式和机制可能会因数据库管理系统和配置而有所不同。表,允许一个事务对整个表进行写操作。

wangZY的博客 1723
上一篇: 【MAC】环境变量
下一篇: 数据库面试题
AXIMI
博客等级 码龄10年 53粉丝 455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值