iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql锁之行级锁和表级意向锁
  • 620
分享到

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

2024-04-02 19:04:59 620人浏览 泡泡鱼
摘要

Innodb存储引擎实现了两种行级锁: l   共享锁 l   排他锁 这两种锁之间的兼容关系如下图所示 共享锁 排他锁

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

不兼容

不兼容

兼容

兼容


您可能感兴趣的文档:

--结束END--

本文标题: Mysql锁之行级锁和表级意向锁

本文链接: https://www.lsjlt.com/news/46825.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MySQL的表级锁,行级锁,排它锁和共享锁是什么
    这篇文章主要介绍“MySQL的表级锁,行级锁,排它锁和共享锁是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的表级锁,行级锁,排它锁和共享锁是什么”文章能帮助大家解决问题。前言先说下事...
    99+
    2023-07-02
  • MySql的行级锁和表级锁是怎样的
    MySql的行级锁和表级锁是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 MySql 行级锁 表级锁如何保...
    99+
    2024-04-02
  • mysql数据库中行级锁、表级锁和页级锁的区别是什么
    这篇文章主要介绍了mysql数据库中行级锁、表级锁和页级锁的区别是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。按粒度可以分为:1、行级锁,MySQL中锁定粒度最细的一种锁,表示只针...
    99+
    2024-04-02
  • mysql锁之三种行级锁介绍
    本文主要介绍 1.mysql三种行锁介绍 2.RR模式下,next-key lock为什么可以解决幻读问题 首先,创建一张表: mysql> show create table test0...
    99+
    2024-04-02
  • Mysql行级锁和页级锁的优缺点
    本篇内容介绍了“Mysql行级锁和页级锁的优缺点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!    如果...
    99+
    2024-04-02
  • MySQL中的行级锁
    行级锁的类型主要有三类: Record Lock,记录锁,也就是仅仅把一条记录锁上;Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身,只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象Next-Key Lock:...
    99+
    2023-09-03
    mysql sqlserver 数据库
  • MySQL行级锁测试
        MySQL innodb存储引擎使用与Oracle相同的行锁机制,对如何查看系统中存在的行锁情况在下面的实验中将会看到。下面是测试过程: session 1:更新...
    99+
    2024-04-02
  • Mysql锁机制之行锁、表锁、死锁的实现
    目录一、Mysql锁是什么?锁有哪些类别?二、行锁和表锁的区别三、InnoDB死锁概念和死锁案例死锁场景一之select for update:死锁场景二之两个update...
    99+
    2024-04-02
  • MySQL的意向共享锁、意向排它锁和死锁是什么
    本篇内容介绍了“MySQL的意向共享锁、意向排它锁和死锁是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、InnoDB的表级锁在绝大多...
    99+
    2023-07-02
  • MySQL:意向锁
    文章目录 重要提示一、加锁级别二、意向锁是什么2.1、意向排它锁2.2、意向共享锁 二、意向锁有什么用2.1、背景2.2、解决方案 三、意向锁和行级锁的场景 重要提示 意向锁之间...
    99+
    2023-09-07
    mysql 数据库
  • MySQL中的锁(表锁、行锁)
    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数...
    99+
    2023-09-02
    java 算法 数据库
  • Mysql表锁与行锁
    Mysql锁实战 前言:什么是锁一:全局锁1.1 概念1.2 作用1.3 使用1.4 特点 二:表级锁2.1 概念2.2 分类2.2.1 表锁2.2.2 元数据锁 MDL2.2.3 意向锁...
    99+
    2023-09-09
    mysql 数据库
  • 一文学习MySQL 意向共享锁、意向排他锁、死锁
    目录一、InnoDB表级锁二、意向共享锁和意向排他锁三、死锁1. 数据库中的死锁2. 死锁场景以及解决办法3. 操作四、锁的优化建议一、InnoDB表级锁 我们知道,InnoDB是支...
    99+
    2024-04-02
  • mysql行锁和表锁怎么使用
    MySQL中的行锁和表锁是用来控制并发访问数据库的机制,可以防止多个用户同时修改同一行或同一表的数据,保证数据的一致性和完整性。1....
    99+
    2023-09-11
    mysql
  • MySQL数据库中怎么实现全局锁和表级锁
    这篇文章给大家介绍MySQL数据库中怎么实现全局锁和表级锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 全局锁全局锁是粒度比较大的锁,基本上也使用不上,就像我们家的大门一样,控制...
    99+
    2024-04-02
  • MySql类型转换导致行锁升级为表锁的示例
    小编给大家分享一下MySql类型转换导致行锁升级为表锁的示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在MySql的写语句中,给表列赋值与表类型不符合时,MySql底层的优化器发挥作用...
    99+
    2024-04-02
  • MySQL表级锁使用说明
    目录表级锁1、表级别的S锁,X锁2、意向锁3、自增锁(AUTO-INC锁)4、元数据锁(MDL锁)表级锁 该锁会锁定整张表,它是mysql中最基本的锁策略,并不依赖于存储引擎(不管你是MySQL的什么存储引擎,对于表锁的...
    99+
    2024-04-02
  • MySQL锁机制详解-表锁与行锁
    文章目录 1. 数据库锁理论2. 锁的分类2.1 按数据操作的类型分类2.2 按数据操作的颗粒度分类 3. 表锁的应用3.1 表锁相关命令3.2 给表加表共享读锁3.3 给表加表独占写锁...
    99+
    2023-09-11
    mysql 数据库
  • MySQL的锁机制之全局锁和表锁的实现
    前言 对mysql锁的总结学习,本文将围绕,加锁的概念,加锁的应用场景和优化,以及不加锁会导致的问题这些方向进行总结学习。mysql的全局锁和表锁是本文的重点 一、全局锁 全局锁的介绍以及使用 全局锁就是对整个数据库实例...
    99+
    2023-01-15
    MySQL全局锁和表锁 MySQL全局锁 MySQL表锁
  • mysql表锁和行锁区别是什么
    小编给大家分享一下mysql表锁和行锁区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、表锁特点:偏向MyISAM存储...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作