Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >✅什么是排他锁、共享锁、意向锁

✅什么是排他锁、共享锁、意向锁

原创
作者头像
@派大星
发布于 2024-05-15 01:07:53
发布于 2024-05-15 01:07:53
8490
举报
文章被收录于专栏:码上遇见你码上遇见你

共享锁

共享锁,又被称为读锁,是由读取操作所创建的一种锁。在此期间,其他用户可以同时读取数据,但在数据上未释放所有共享锁之前,任何事务均无法对其进行修改(即获取数据的排他锁)。

一旦事务T对数据A加上共享锁,其他事务只能对A再加共享锁,而无法加排他锁。获得共享锁的事务仅可读取数据,不可修改数据。

代码语言:plsql
AI代码解释
复制
SELECT ... LOCK IN SHARE MODE;

在查询语句后增加LOCK IN SHARE MODE,MySQL会对查询结果中的每一行都加上共享锁。当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁;否则会被阻塞。其他线程也可以读取已被共享锁保护的表,且这些线程读取的是同一版本的数据。

排他锁

排他锁又称为写锁。如果事务T对数据A加上排他锁,则其他事务无法对A加任何类型的锁。获得排他锁的事务既能读取数据,又能修改数据。

代码语言:plsql
AI代码解释
复制
SELECT ... FOR UPDATE;

在查询语句后增加FOR UPDATE,MySQL会对查询结果中的每一行记录都加上排他锁。只有在没有其他线程对查询结果集中的任何一行使用排他锁时,才能成功申请排他锁;否则会被阻塞。

意向锁

在MySQL的InnoDB引擎中,支持多种锁级别,其中包括行级锁和表级锁。当多个事务需要访问同一共享资源时,如果每个事务都直接请求获取锁,可能会发生相互阻塞的情况,甚至可能导致死锁的产生。

举个例子:

假设事务A对表Table1中的某一行加上了行级锁,这使得该行记录只能被读取而不能被修改。同时,事务B试图对Table1增加表级锁。如果事务B成功获取了表级锁,那么它就可以修改表中的任意一行记录,这就导致了冲突。

为了解决这个问题,需要让事务B在尝试对Table1增加表级锁之前,先判断是否有其他事务已经对该表的某行加了行级锁。但是,事务B显然不能遍历整个表的数据逐条进行判断是否有加锁。

因此,MySQL引入了意向锁机制。意向锁是数据库管理系统中用于实现锁协议的一种机制,旨在处理不同锁粒度(如行锁和表锁)之间的并发性问题。这种机制帮助解决了不同锁粒度之间的并发问题,而对于相同锁粒度之间的并发问题,可以通过行级互斥锁来解决。

注意:

  1. 意向锁并非直接用于锁定资源,而是用于通知其他事务,以避免它们在资源上设置不兼容的锁。
  2. 意向锁并非由用户直接请求,而是由MySQL管理的。

当一个事务请求获取行级锁或表级锁时,MySQL会自动获取相应表的意向锁。这样,其他事务在请求获取表锁时,就可以首先基于这个意向锁来发现是否已经有其他事务加过锁,并根据该锁的类型(意向共享锁/意向排他锁)来判断自己是否可以获取锁。通过这种方式,可以在不阻塞其他事务的情况下,为当前事务锁定资源。意向锁有两种类型:意向共享锁和意向排他锁。

  1. 意向共享锁:表示事务打算在资源上设置共享锁(读锁)。通常用于表明事务计划读取资源,并希望在读取时不会有其他事务设置排他锁。
  2. 意向排他锁:表示事务打算在资源上设置排他锁(写锁)。这表示事务计划修改资源,并不希望有其他事务同时设置共享或排他锁。

意向锁是一种表级锁,在触发意向锁的事务提交或回滚后会被释放。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
介绍下InnoDB的锁机制?
在InnoDB中,锁可以分为两种级别,一种是共享锁(S锁),另一种是排他锁(X锁)。
@派大星
2024/05/11
1900
MySQL 意向共享锁、意向排他锁、死锁
我们知道,InnoDB是支持行锁,但不是每次都获取行锁,如果不使用索引的,那还是获取的表锁。而且有的时候,我们希望直接去使用表锁
终有救赎
2023/11/08
1.2K0
MySQL 意向共享锁、意向排他锁、死锁
锁系列-Mysql中的锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。 目录: 1、行级锁、表级锁、页级锁 2、共享锁和排它锁 3、演示 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。 行级锁、表级锁、页级锁 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。 特点
ImportSource
2018/04/03
1.3K0
锁系列-Mysql中的锁
细说MySQL锁机制:S锁、X锁、意向锁…
好久没有深入地写文章了,这次来发一篇,通过mysql事物 | Joseph's Blog (gitee.io)和其他一些博客有感进行一些补充,InnoDB详解在下期发布
Karos
2023/06/14
9K0
细说MySQL锁机制:S锁、X锁、意向锁…
MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁
客户端发往MySQL的一条条SQL语句,实际上都可以理解成一个个单独的事务(一条sql语句默认就是一个事务)。而事务是基于数据库连接的,每个数据库连接在MySQL中,又会用一条工作线程来维护,也意味着一个事务的执行,本质上就是一条工作线程在执行,当出现多个事务同时执行时,这种情况则被称之为并发事务,所谓的并发事务也就是指多条线程并发执行。
寻求出路的程序媛
2024/06/24
23.9K5
MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁
【MySQL-25】万字总结<锁>——(全局锁&行级锁&表级锁)【共享锁,排他锁】【间隙锁,临键锁】【表锁,元数据锁,意向锁】
默认情况下,InnODB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 临键锁 进行搜索和索引扫描,以防止幻读。(本次演示)
YY的秘密代码小屋
2024/09/09
2960
【MySQL-25】万字总结<锁>——(全局锁&行级锁&表级锁)【共享锁,排他锁】【间隙锁,临键锁】【表锁,元数据锁,意向锁】
Mysql的各种锁——Mysql系列(三)
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-shared-exclusive-locks
翰墨飘香
2023/06/11
6450
面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁
  今天的主人公是我们公司同事侨总,传说中手上有10个比特币的男人。自从比特币大涨以来,养成了几个小爱好:周末听戏坐包厢,骑马酒吧滑雪场。
陈哈哈
2021/10/13
5850
MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)
在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。
兔云小新LM
2019/07/30
2.8K0
数据库相关锁总结(共享锁,排它锁,更新锁,意向锁,计划锁),看完这篇将会对锁产生更深的理解
数据库大并发操作要考虑死锁和锁的性能问题。看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程。T3,T4以此类推。下面以SQL Server(2005)为例
小尘要自信
2023/10/10
7760
MySQL高级9-锁
  锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(CPU、RAM、i/O)的挣用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素,从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
Se7eN_HOU
2023/09/06
2810
MySQL高级9-锁
Mysql锁详解(行锁、表锁、意向锁、Gap锁、插入意向锁)
3、例子:事务A修改user表的记录r,会给记录r上一把行级的排他锁(X),同时会给user表上一把意向排他锁(IX),这时事务B要给user表上一个表级的排他锁就会被阻塞。意向锁通过这种方式实现了行锁和表锁共存且满足事务隔离性的要求。
全栈程序员站长
2022/08/25
3.5K0
Mysql锁详解(行锁、表锁、意向锁、Gap锁、插入意向锁)
什么是意向锁?它和意向书有什么区别?
最近受废话文学的影响,所以有了今天的这个标题,希望大家能喜欢。大家不喜欢也没关系,反正我喜欢。
磊哥
2023/12/28
3270
什么是意向锁?它和意向书有什么区别?
mysql共享锁与排他锁
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。
MickyInvQ
2020/09/27
1.9K0
mysql共享锁与排他锁
mysql事务隔离级别详解和实战
设置innodb的事务级别方法是:set 作用域 transaction isolation level 事务隔离级别,例如~
sunsky
2020/08/20
9300
mysql事务隔离级别详解和实战
MySQL 锁
全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。
恋喵大鲤鱼
2023/10/23
3980
了解 MySQL 数据库中的各种锁
上篇文章学习了事务的隔离级别,其中隔离性是通过锁来实现的,篇幅原因将锁单独分开介绍,下面让我们一起学习 MySQL 中各种锁。
用户6256742
2024/06/20
3170
了解 MySQL 数据库中的各种锁
对于MySQL你必须要了解的锁知识
MySQL 的锁按照范围可以分为全局锁、表锁、行锁,其中行锁是由数据库引擎实现的,并不是所有的引擎都提供行锁,MyISAM 就不支持行锁,所以文章介绍行锁会以InnoDB引擎为例来介绍行锁。
本人秃顶程序员
2019/04/29
7350
对于MySQL你必须要了解的锁知识
一文读懂 MySQL 锁
锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制。MySQL中为了保证数据访问的一致性与有效性等功能,实现了锁机制,MySQL中的锁是在服务器层或者存储引擎层实现的。
说故事的五公子
2022/10/30
7120
一文读懂 MySQL 锁
【MySQL】一文带你理清<表级锁>(表锁,元数据锁,意向锁)
YY的秘密代码小屋
2024/09/09
3960
【MySQL】一文带你理清<表级锁>(表锁,元数据锁,意向锁)
推荐阅读
相关推荐
介绍下InnoDB的锁机制?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档