首页 > 数据库 >MySQL-表级锁(表锁、元数据锁、意向锁)

MySQL-表级锁(表锁、元数据锁、意向锁)

时间:2024-07-03 23:26:24浏览次数:19  
标签:写锁 lock 读锁 意向锁 表锁 表级 客户端

文章目录

1、表级锁介绍

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中

1.1、对于表级锁,主要分为以下三类:

  • 表锁(共享读锁、独占写锁)
  • 元数据锁(meta data lock,MDL)
  • 意向锁

2、表锁

2.1、对于表锁,分为两类:

  • 共享读锁(read lock)
  • 独占写锁(write lock)

2.2、共享读锁

在这里插入图片描述
左侧为客户端一,对指定表加了读锁,不会影响右侧客户端二的读,但是会阻塞右侧客户端的

2.2.1、创建表 score

create table score(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score(id, name, math, english, chinese) VALUES (1, 'Tom', 67, 88, 95), (2, 'Rose' , 23, 66, 90),(3, 'Jack', 56, 98, 76);

在这里插入图片描述
在这里插入图片描述

2.3、独占写锁

在这里插入图片描述
左侧为客户端一,对指定表加了写锁,会阻塞右侧客户端的

在这里插入图片描述
在这里插入图片描述

3、元数据锁

在这里插入图片描述

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性

这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。

MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)

在这里插入图片描述当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁(EXCLUSIVE),之间是互斥的。

在这里插入图片描述
在这里插入图片描述

3.1、查看数据库中的元数据锁的情况

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

在这里插入图片描述
在这里插入图片描述
当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁(SHARED_READ /
SHARED_WRITE),之间是兼容的。

4、意向锁

为了避免DML在执行时,加的行锁表锁冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

4.1、假如没有意向锁

假如没有意向锁,客户端一对表加了行锁后,客户端二如何给表加表锁呢,来通过示意图简单分析一下:

首先客户端一,开启一个事务,然后执行DML操作,在执行DML语句时,会对涉及到的行加行锁。
在这里插入图片描述
客户端二,想对这张表加表锁时,会检查当前表是否有对应的行锁,如果没有,则添加表锁,此时就会从第一行数据,检查到最后一行数据,效率较低。
在这里插入图片描述

4.2、有了意向锁之后

客户端一,在执行DML操作时,会对涉及的行加行锁,同时也会对该表加上意向锁。
在这里插入图片描述
而其他客户端,在对这张表加表锁的时候,会根据该表上所加的意向锁来判定是否可以成功加表锁,而不用逐行判断行锁情况了。
在这里插入图片描述

4.3、查看意向锁及行锁的加锁情况

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

4.3.1、意向共享锁与表读锁是兼容的

在这里插入图片描述
在这里插入图片描述

4.3.2、意向排他锁与表读锁、写锁都是互斥的

在这里插入图片描述
在这里插入图片描述

标签:写锁,lock,读锁,意向锁,表锁,表级,客户端
From: https://blog.csdn.net/m0_65152767/article/details/140086916

相关文章

  • MySQL----表级锁&行级锁&排它锁和共享锁&意向锁
    MySQL的锁机制锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。在MySQL中,不同存储引擎使用不同的加锁方式;我们以InnoDB存储引擎为例介绍MySQL中的锁机制,其他存储引擎中的锁相对简单一些。表级锁&行级锁表级锁:对整张表加锁。开销小,加锁快,不会出现......
  • 达梦表级触发器
     //达梦触发器CREATEORREPLACETRIGGER"K_BASIC"."B_BASE_ENGINEERING_CATEGORYTOB_PROJECT_INVESTMENT"AFTERUPDATEORINSERTON"K_BASIC"."B_BASE_ENGINEERING_CATEGORY"REFERENCINGOLDROWAS"OLD"NEWR......
  • RR级别-多线程环境下-for update+插入操作包含的间隙锁+插入意向锁引发的死锁问题
    记录selectforupdatemysql死锁问题_执行select...where...forupdate是否会造成死锁(deadlock)-CSDN博客......
  • InnoDB常用锁总结(行锁、间隙锁、临键锁、表锁)
    相关文章数据库系列:MySQL慢查询分析和性能优化数据库系列:MySQL索引优化总结(综合版)数据库系列:高并发下的数据字段变更数据库系列:覆盖索引和规避回表数据库系列:数据库高可用及无损扩容数据库系列:使用高区分度索引列提升性能数据库系列:前缀索引和索引长度的取舍数据库系列:My......
  • mysql查询锁表和是否表锁
    #查询是否有锁表SHOWOPENTABLESFROM数据库WHEREin_use>0#查询被锁的表SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;#查询进程showprocesslist;#杀死进程killxx;#查看正在锁的事务select*frominformation_schema.INNODB_LOCKS;#杀死进程id(就是[se......
  • MySQL全局锁,表锁,行锁
    数据库锁设计的初衷是处理并发问题,作为多用户共享的资源,当出现并发访问的时候,数据库需要合理的控制资源的访问规则,而锁就是用来实现这些访问规则的重要数据结构根据加锁的范围,MySQL里的锁大概可以分为全局锁,表级锁,行锁三类一、全局锁全局锁就是对整个数据库实例加锁,MySQL提供......
  • gbase8s数据表级别的同步(部分数据的下发等功能)一
    一、ER的部署(一)环境检查1.操作系统环境检查虚拟机是centos进行虚拟出来的测试机[root@node01install]#uname-aLinuxnode013.10.0-1160.71.1.el7.x86_64#1SMPTueJun2815:37:28UTC2022x86_64x86_64x86_64GNU/Linux2.数据库部署信息检查服务器名称服......
  • openGauss 表级别并行恢复优化
    表级别并行恢复优化可获得性本特性自openGauss5.1.0版本开始引入。特性同时合入3.0.5。特性简介允许用户在配置表级别并行恢复时,通过更多的参数控制回放行为,以达到增加恢复效率的目的。客户价值通过wal恢复效率提升可减小备库wal日志积压,减小磁盘存储压力。在switchover......
  • MySQL中行级锁与表级锁与页级锁的区别
    #       再次复习MyISAM和InnoDB存储引擎时,发现两个存储引擎的区别包括MyISAM只支持表级锁,而InnoDB还支持行级锁,因为没有系统的了解过锁的概念,因此花了点时间进行了初步的学习,若有不对之处,望有指正;#简单回忆MyISAM与InnoDB区别MyISAM是5.5版之前,由于其缺陷明显......
  • 一条 sql 语句可能导致的表锁和行锁以及死锁检测
       锁      MDL         当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁         ALTERTABLEtbl_nameNOWAITaddcolumn...         ALTERTABLEtbl_nameWAITNaddcolumn.......