当前位置:网站首页 > SQL数据库编程 > 正文

mysql查询锁表的sql(mysql如何查看锁表语句)



文章目录

  • 一、MySQL中各方面锁的分类
  • 二、解释锁
  • 2.1 全局锁
  • 2.1.1 解释
  • 2.1.2 全局锁的作用
  • 2.1.3 释放锁
  • 2.1.4 全局锁的场景(mysqldump)
  • 2.1.5 全局锁加锁的方法
  • 2.2 表级锁
  • 2.2.1 表锁
  • 2.2.1.1 解释
  • 2.2.1.2 表锁的作用
  • 2.2.1.3 释放锁
  • 2.2.2 MDL(元数据锁)
  • 2.2.2.1 解释
  • 2.2.2.2 MDL的作用
  • 2.2.2.3 MDL锁测试
  • 2.2.2.4 解决MDL锁问题
  • 2.3 行级锁
  • 2.3.0 什么叫共享锁和排它锁?
  • 2.3.1 解释
  • 2.3.2 加锁方式
  • 2.3.3 测试
  • 2.3.3.1 共享锁
  • 2.3.3.2 排它锁
  • 2.4.1 间隙锁
  • 2.4.1.1 解释
  • 2.4.1.2 间隙锁的条件
  • 2.4.1.3 测试
  • 2.4.2 Recordlock锁
  • 2.4.3 next-key锁
  • 2.5 插入意向锁

2.1.1 解释

全局锁,字面意思就是MySQL全局的锁,MySQL使用Flush tables with read lock (FTWRL)来加全局读锁。

2.1.2 全局锁的作用

2.1.3 释放锁

2.1.4 全局锁的场景(mysqldump)

我们可以打开mysql的general_log。然后进行备份操作,general_log中会有加锁过程的。

general_log

2.1.5 全局锁加锁的方法

MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。

2.2.1 表锁

2.2.1.1 解释

表锁,顾名思义就是限制单表的一种锁,可以通过语句(lock tables 表名 read/write)来限制该表。下面用小测试来讲述。
lock tables sbtest1 read
#当前会话:
当前会话对sbtest1无写权限,当前会话对别的表无修改及查看权限







#其他会话:
对所有表都有查询权限,对sbtest1表无修改权限

lock tables sbtest1 write
#当前会话
对sbtest1拥有查询权限和修改权限,对其他表没有修改权限和查询权限




#其他会话
对sbtest1没有查询权限和修改权限,对其他表有查询权限和修改权限

2.2.1.2 表锁的作用

在没有出现粒度更小的行锁的情况下,表锁是控制并发主要的方法。但是现在基本上没有人会锁定整个表,因为这样的对业务影响太巨大。

2.2.1.3 释放锁

2.2.2 MDL(元数据锁)

MDL全称metadata lock,所以又称元数据锁。

2.2.2.1 解释

MDL是另外一种表级别的锁,它不需要显示使用,也就是说,当你对一个表进行查询的时候,它会自动获得MDL读锁,当你对一个表进行增删改查的时候(比如修改表结构),会获得MDL写锁。

2.2.2.2 MDL的作用

MDL的作用是,保证读写的正确性。比如当你在进行查询的时候,另外一个人将你的表结构改了,想想就心头一颤。。

2.2.2.3 MDL锁测试

1.会话1(查询)

2.会话2(查询)

3.会话3(修改表结构)

锁指定的数据库mysql语句_MySQL

锁指定的数据库mysql语句_mysql_02

总结:我们可以看到当有两个线程相继拿到MDL读锁的时候,再进行修改表结构等操作的时候,该线程会去拿该表的MDL写锁,但是读锁没有释放,写锁是拿不到的,所以该操作就会夯住,此刻该表就完全锁住了,后面的查询操作或者写操作也会被夯住,而且表锁不像行锁,不会有超时时间,会一直夯下去,直到你COMMIT或ROLLBACK。所以是比较危险的。

2.2.2.4 解决MDL锁问题

解决这个问题,也就是提交或者回滚这个事务,我们可以通过information_schema.innodb_trx这个表找到该事务。

2.3.0 什么叫共享锁和排它锁?

2.3.1 解释

2.3.2 加锁方式

2.3.3 测试

2.3.3.1 共享锁

总结:当一个线程获得一部分结果集(某些行)的共享锁的时候,其他线程可以获得该结果集的共享锁(可查询),但是不能获得该结果集的排它锁(不可修改)

2.3.3.2 排它锁

总结:当一个线程获得某部分结果集的排它锁的时候,其他线程不能获得该部分结果集的共享锁和排它锁。

PS : Next-KeyLocks=Gap锁+ Recordlock锁

2.4.1 间隙锁

(不锁记录,仅仅记录前面的Gap)
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件 的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”, InnoDB也会对这个“间隙”加锁。

2.4.1.1 解释
2.4.1.2 间隙锁的条件

gap lock的前置条件:
1 事务隔离级别为REPEATABLE-READ, innodb_locks_unsafe_for_binlog参数为0,且sql走的索引为非唯一索引(无论是等值检索还是范围检索)
2 事务隔离级别为REPEATABLE-READ, innodb_locks_unsafe_for_binlog参数为0,且sql是一个范围的当前读操作,这时即使不是非唯一索引也会加gap lock




2.4.1.3 测试

2.4.2 Recordlock锁

(锁数据,不锁Gap)
记录锁是对索引记录的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;阻止任何其他事务插入、更新或删除 t.c1 值为 10 的行。 记录锁总是锁定索引记录,即使一个表没有定义索引。对于这种情况,InnoDB 会创建一个隐藏的聚集索引并使用该索引进行记录锁定。

2.4.3 next-key锁

到此这篇mysql查询锁表的sql(mysql如何查看锁表语句)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • mysql主从主键冲突(mysql 主键冲突)2026-02-08 18:18:04
  • 达梦数据库执行sql脚本(达梦数据库导入sql脚本)2026-02-08 18:18:04
  • mysql的主键可以是varchar类型吗(mysql主键可以是字符串吗)2026-02-08 18:18:04
  • redhat enterprise 9(redhat enterprise 9 安装MySQL 8)2026-02-08 18:18:04
  • mysql查询锁表吗(mysql查询锁表的sql)2026-02-08 18:18:04
  • sqlldr执行命令(sqlldr命令详解)2026-02-08 18:18:04
  • mysql查询锁表的sql(mysql 查锁表)2026-02-08 18:18:04
  • SQL窗口函数速查表.pdf(SQL窗口函数速查表 百度网盘)2026-02-08 18:18:04
  • 增删改查sql语句关键字(简单的增删改查sql语句)2026-02-08 18:18:04
  • druid监控页面分析(druid sql监控页面说明)2026-02-08 18:18:04
  • 全屏图片