我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql锁之行级锁和表级意向锁

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql锁之行级锁和表级意向锁

Innodb存储引擎实现了两种行级锁:

l   共享锁

l   排他锁

这两种锁之间的兼容关系如下图所示


共享锁

排他锁

共享锁

兼容

不兼容

排他锁

不兼容

不兼容

关于行级锁比较容易理解。下面介绍一下表级意向锁。

Innodb存储引擎支持多粒度的锁定,换句话说,允许事务在表级和行级上同时持有锁。意向锁是一种表级锁,它是由存储引擎自己维护的,不需要用户手动命令干预。如果事务想要给表中几行数据加上行级共享锁,那么需要先在表级别加上意向共享锁(IS);如果事务想要给表中几行数据加上行级排他锁,那么需要先在表级别加上意向排他锁(IX)。那么这两种表级锁有什么意义呢?

比如存在这样一种情况。一个会话A开启如下事务,在表中的一行上面加上一行排他锁,并且没有提交。

mysql>   begin;

Query OK, 0   rows affected (0.00 sec)

 

mysql>   SELECT * FROM t_compact WHERE c1 = 'a' FOR UPDATE;

+------+------+------+

| c1   | c2     | c3   |

+------+------+------+

| a    | aa     | aaa  |

+------+------+------+

1 row in set   (0.00 sec)

会话B需要给表加一个读锁,比如lock tables t_compact read;那么就要在表级别加共享锁。加锁之前需要确认一件事,那就是表中的所有的行上面都没有排他锁,否则会出现行锁和表锁的共存冲突问题。如果没有表级意向锁的话,那么会话B需要去每一行检查是否存在行级排他锁,所以意向表级锁就是用来缩短这个检查过程的。它将检查每一行的排他锁变成了只要检查一个表级锁就可以了。

存在意向锁之后,整个过程变成了这样:会话A在以排他锁锁住一行之前,需要先加一个表级别的意向排他锁,成功之后再在需要锁住的那一行上面加行级排他锁。这时会话B需要在表级别加共享锁,这时它发现表上已经存在意向排他锁,那么说明表中已经有数据行上有行级排他锁,那么会话B就需要等待。

表级意向锁相互之间是完全兼容的。


IS

IX

IS

兼容

兼容

IX

兼容

兼容

关于表级意向锁互相兼容,下面的列子可以帮助理解。

仍然是表t_compact,注意表上存在一个主键

mysql> show create table t_compact\G

*************************** 1. row   ***************************

         Table: t_compact

Create Table: CREATE TABLE `t_compact` (

    `c1` varchar(10) NOT NULL,

    `c2` char(10) DEFAULT NULL,

    `c3` varchar(10) DEFAULT NULL,

    PRIMARY KEY (`c1`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

会话A,在一行上即行级排他锁

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * FROM t_compact WHERE   c1 = 'a' FOR UPDATE;

+----+------+------+

| c1 | c2   | c3     |

+----+------+------+

| a    | aa   | aaa  |

+----+------+------+

1 row in set (0.00 sec)

 

会话B,在另一行上加行级排他锁。由于会话A的缘故,表上已经存在意向排他锁,会话B也需要在表上加意向排他锁,由于意向锁的兼容性,意向排他锁也是可以加的上去的。下面再去检查c1 = 'b'行上有没有行级排他锁,经检查没有行级排他锁,那么c1 = 'b'上加行级排他锁,不会阻塞。

可是如果会话B也要在c1 = 'a'上加行级排他锁,那么加完意向排他锁之后,检查行级排他锁就会发现已经存在,那么就会被阻塞。

所以,这种兼容性有助于提高并发能力。

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * FROM t_compact WHERE   c1 = 'b' FOR UPDATE;

+----+------+------+

| c1 | c2   | c3     |

+----+------+------+

| b    | bb   | bbb  |

+----+------+------+

1 row in set (0.00 sec)

 

综合一下行级锁和意向表级锁的兼容性


S

X

IS

IX

S

兼容

不兼容

兼容

不兼容

X

不兼容

不兼容

不兼容

不兼容

IS

兼容

不兼容

兼容

兼容

IX

不兼容

不兼容

兼容

兼容


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql锁之行级锁和表级意向锁

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL的表级锁,行级锁,排它锁和共享锁

目录前言一、表级锁&行级锁二、排它锁&共享锁1. 测试不同事务之间排它锁和共享锁的兼容性2. 测试行锁加在索引项上三、串行化隔离级别测试前言如果我们和面试官聊到事务的问题,怎么回答呢?先说下事务是什么,因为我们业务是比较复杂的,不可能一
2022-07-14

MySQL的表级锁,行级锁,排它锁和共享锁是什么

这篇文章主要介绍“MySQL的表级锁,行级锁,排它锁和共享锁是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的表级锁,行级锁,排它锁和共享锁是什么”文章能帮助大家解决问题。前言先说下事
2023-07-02

MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?

备份数据库的工具是 mysqldump,在使用 mysqldump 时加上 –single-transaction 参数的时候,就会在备份数据库之前先开启事务。这种方法只适用于支持「可重复读隔离级别的事务」的存储引擎。

Mariadb之显式使用表锁和行级锁 - Linux

首先我们来看看mariadb的锁定概念,所谓锁就是当一个进程或事务在操作某一资源时,为了防止其他用户或者进程或事务对其进行资源操作,导致资源抢占而发生冲突,通常在A进程操作该资源时,会对该资源进行加锁,实现多进程或多用户操作同一资源时,不会发生冲突;通常情况锁
Mariadb之显式使用表锁和行级锁 - Linux
2019-01-08

MySQL的意向共享锁、意向排它锁和死锁

目录一、InnoDB的表级锁二、意向共享锁和意向排它锁三、死锁1. 数据库中的死锁2. 死锁场景以及解决方法3. 操作三、锁的优化建议一、InnoDB的表级锁在绝大多数情况下应该使用行锁,因为事务和行锁往往是选择InnoDB的理由,但个别
2022-07-14

Java中的锁升级机制:偏向锁、轻量级锁和重量级锁

我们需要重点分析MarkWord对象头,因为Markword 是保存锁状态的关键,对象锁状态可以从偏向锁升级到轻量级锁,再升级到重量级锁,加上初始的无锁状态,可以理解为有 4 种状态。想在一个对象中表示这么多信息自然就要用位来存储。

MySQL的意向共享锁、意向排它锁和死锁是什么

本篇内容介绍了“MySQL的意向共享锁、意向排它锁和死锁是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、InnoDB的表级锁在绝大多
2023-07-02

MySQL的全局锁和表级锁的具体使用

目录前言全局锁表级锁表锁元数据锁(Metadata Locking,简称:MDL锁)总结参考资料前言在真实的企业开发环境中使用MySQL,MySQL肯定不会只有我一个人使用,而是一个团队显式的使用MySQL,或者是业务隐式的使用MySQL,
2022-05-13

mysql行锁和表锁怎么使用

MySQL中的行锁和表锁是用来控制并发访问数据库的机制,可以防止多个用户同时修改同一行或同一表的数据,保证数据的一致性和完整性。1. 行锁:行锁是对数据表中的某一行进行锁定,只有锁定的行才能被修改。行锁可以通过以下方式来使用:- 在需要锁定
2023-09-11

MySQL的行级锁锁的到底是什么?

往期在文章《介绍Innodb的锁机制》中提到过关于记录锁,但是没有详细展开描述,本片文章简单聊一聊。

MySQL的锁机制之全局锁和表锁的实现

前言对mysql锁的总结学习,本文将围绕,加锁的概念,加锁的应用场景和优化,以php及不加锁会导致的问题这些方向进行总结学习。mysql的全局锁和表锁是本文的重编程点一、全局锁全局锁的介绍以及使用全局锁就是对整个数据库实例进行加锁。
2023-01-15

编程热搜

目录