mysql死锁过程及案例详解之元数据锁metadatalock(代码片段)

ShenLiang2025 ShenLiang2025     2023-01-17     226

关键词:

Mysql数据锁MetaData Lock

元数据锁MetaData Lock

元数据锁MetaData Locks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改。

MetaData Lock是表级锁。

MetaData Lock是排他锁,当该锁存在时不能有其它的连接对表的模式进行修改。

关于元数据锁的最大问题是空闲事务(因网络断开或者程序Bug而导致的COMMIT/ROLLBACK语句没有传给数据库,也没有释放线程而导致线上事务锁定等待严重、连接数暴涨的情况)会阻止DDL语句的执行。

示意案例

--Step1 会话1里查看连接ID
SELECT CONNECTION_ID();
/*
CONNECTION_ID()
8
*/
START TRANSACTION;
SELECT *,SLEEP(15) FROM emp WHERE empno=7566;

--Step2 会话2里查看连接ID
SELECT CONNECTION_ID();
/*
CONNECTION_ID()
9
*/

OPTIMIZE TABLE emp;

--Step3 会话3里查看查看连接ID
SELECT thd_id, conn_id, state,
current_statement,
last_statement
FROM sys.session
WHERE conn_id IN (8, 9)

thd_id	conn_id	state	current_statement	last_statement
49	9	Waiting for table metadata lock	OPTIMIZE TABLE emp	
48	8			SELECT *,SLEEP(60) FROM emp WHERE empno=7566


通过这个示例我们可以看到有个会话1在执行有个持续的事务,而在第二个会话里执行了语句 OPTIMIZE TABLE emp(OPTIMIZE TABLE语句本身不会改变表的结构,但是会触发metadata lock),知道会话1里的事务提交或者回滚后会话2才能正常执行,即metalock锁释放。

我们也可以通过系统表(视图)来查看当前metadata lock的情况。


--会话3里执行
Connection 3> SELECT *
FROM performance_schema.metadata_locks
WHERE OBJECT_NAME = 'emp'

mysql> SELECT * FROM performance_schema.metadata_locks WHERE OBJECT_NAME = 'emp' \\G
*************************** 1. row ***************************
          OBJECT_TYPE: TABLE
        OBJECT_SCHEMA: ShenLiang2025
          OBJECT_NAME: emp
          COLUMN_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139887555287408
            LOCK_TYPE: SHARED_READ
        LOCK_DURATION: TRANSACTION
          LOCK_STATUS: GRANTED
               SOURCE: sql_parse.cc:5801
      OWNER_THREAD_ID: 51
       OWNER_EVENT_ID: 80
*************************** 2. row ***************************
          OBJECT_TYPE: TABLE
        OBJECT_SCHEMA: ShenLiang2025
          OBJECT_NAME: emp
          COLUMN_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139887489260736
            LOCK_TYPE: SHARED_NO_READ_WRITE
        LOCK_DURATION: TRANSACTION
          LOCK_STATUS: PENDING
               SOURCE: sql_parse.cc:5801
      OWNER_THREAD_ID: 52
       OWNER_EVENT_ID: 13
2 rows in set (0.00 sec)

这里可以看到进程ID号是51由于是一个未完成的事务,所以获得一个共享的读锁。
而进程ID是52的会话则因为执行了DDL语句在等待锁释放,即状态是PENDING。

mysql死锁过程及案例详解之清空缓存锁flushlocks(代码片段)

Mysql清空缓存锁FlushLocks 清空缓存锁FlushLocksflushtable的功能是关闭所有打开的表,强制关闭所有正在使用的表,并刷新准备好的语句缓存。这种操作需要用户拥有 FLUSH_TABLES、RELOAD权限。flushtables在已经锁定表(对应LOCK... 查看详情

mysql死锁过程及案例详解之记录锁与间隔锁recordlockgaplock(代码片段)

记录锁RecordLock与间隔锁GAPLock记录锁RecordLock记录锁RecordLocks又称为行锁,它同时包含索引和间隔锁。记录锁可以是共享锁也可能是排他锁。可以通过performance_schema.data_locks表的LOCK_TYPE和LOCK_MODEL来查看。示意案例--Step1开始事务&... 查看详情

mysql死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁insertintentionlockauto-incrementlockbackuplockloglock

Mysql插入意向锁与自增锁备份锁日志锁插入意向锁InsertIntentionLock插入意向锁Insertintentionlocks是记录级别的,它通过“INSERT”关键词来向其它的事务传达插入的意向。插入意向锁针对的是将要插入的记录而不是已经存在的记录... 查看详情

mysql死锁过程及案例详解之显式与隐式锁explicittablelockimplicittablelock(代码片段)

显式锁ExplicitTableLock与隐式锁ExplicitTableLock显式锁ExplicitTableLock显式表锁(ExplicitTableLocks)即通过命令locktables对表进行锁定(共享或排他锁)、FLUSHTABLESWITHREADLOCK(共享锁),直到用显式的命令UNLOCKTABLES语句才能解锁。当FLUSHTABLESWITHREAD... 查看详情

mysql-死锁的产生及解决方案(代码片段)

MySQL-死锁的产生及解决方案1.死锁与产生死锁的四个必要条件1.1什么是死锁1.2死锁产生的4个必要条件2.死锁案例2.1表锁死锁2.2行锁死锁2.3共享锁转换为排他锁3.死锁排查4.实例分析4.1案例描述4.2案例死锁问题复现4.3死锁排查4.4解决... 查看详情

mysql并发时经典常见的死锁原因及解决方法(代码片段)

文章目录1.mysql都有什么锁2.什么情况下会造成死锁3.Mysql死锁案例3.1案例13.2案例23.3案例31.mysql都有什么锁MySQL有三种锁的级别:页级、表级、行级。表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,... 查看详情

详解mysql(innodb)是如何处理死锁的

一、什么是死锁官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人。你让对面放人,对面让你放人。二、为什... 查看详情

mysql加锁过程详解-基本知识

 Mysql加锁过程详解(1)-基本知识Mysql加锁过程详解(2)-关于mysql幻读理解Mysql加锁过程详解(3)-关于mysql幻读理解Mysql加锁过程详解(4)-selectforupdate/lockinsharemode对事务并发性影响Mysql加锁过程详解(5)-innodb多版本并发控... 查看详情

mysql产生死锁原因(代码片段)

阅读目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍MySQL有三种锁的级别:页级、表级、行级1表级锁:开销小,加锁快;不会出现死锁;锁定粒... 查看详情

mysql加锁过程详解-innodb下的记录锁,间隙锁,next-key锁(代码片段)

Mysql加锁过程详解(1)-基本知识Mysql加锁过程详解(2)-关于mysql幻读理解Mysql加锁过程详解(3)-关于mysql幻读理解Mysql加锁过程详解(4)-selectforupdate/lockinsharemode对事务并发性影响Mysql加锁过程详解(5)-innodb多版本并发控制原... 查看详情

mysql产生死锁原因(代码片段)

阅读目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍MySQL有三种锁的级别:页级、表级、行级1表级锁:开销小,加锁快;不会出现死锁;锁定粒... 查看详情

mysql发生死锁问题请求帮助

目测不是因为存储过程内sql导致的死锁:因为存储过程内只有一条insert语句会持有锁,也只持有一把锁。所以不会导致死锁。引起死锁肯定是由于资源共享冲突,事务是保证一个操作单元能执行顺利或失败,保证数据的完整性的... 查看详情

mysql锁机制详解(代码片段)

...锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,说说自己的理解,如果发现有不对的地方,欢迎指正。概述  总的来说,InnoDB共有七种类型的锁:共享/排它... 查看详情

记录一次mysql死锁排查过程(代码片段)

背景以前接触到的数据库死锁,都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁。借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景。在多方调研以及和同事们的讨论下终... 查看详情

记录一次mysql死锁排查过程(代码片段)

背景以前接触到的数据库死锁,都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁。借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景。在多方调研以及和同事们的讨论下终... 查看详情

mysql中的锁机制详解(代码片段)

...是采用行级锁。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定 查看详情

用sql语句,怎么解决mysql数据库死锁

MySQL死锁问题的相关知识是本文我们主要要介绍的内容,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。  1、MySQL常用存储引擎的锁机制  MyISAM和MEMORY采用表级锁(table-levellocking)  BDB采用页面锁(page-levellockin... 查看详情

mysql存储过程出现死锁

...多个线程来跑存储过程啊。。。可以啊就是有机率会出现死锁的情况。。这样怎么解决啊产生死锁的四个必要条件:(1)互斥条件:一个资源每次只能被一个进程使用。(2)请求与保持条件:一个进程因请求资源而阻塞时,对... 查看详情