【第27天】SQL进阶-查询优化- performance_schema系列实战三:锁问题排查(表级锁)(SQL 小虚竹)

news2024/12/24 21:30:39

回城传送–》《32天SQL筑基》

文章目录

  • 零、前言
  • 一、什么是表级锁
  • 二、什么时候适合加表级锁
  • 三、实战演练
    • 3.1 数据准备(如果已有数据可跳过此操作)
    • 3.2 开启第一个会话,执行显式加表级锁
    • 3.3 开启第二个会话,对该表执行update更新
    • 3.4 开启第三个会话,查询线程信息
    • 3.5 分析
    • 3.6 释放第一个会话的表读锁
  • 四、总结
  • 五、参考

零、前言

今天是学习 SQL 打卡的第 27 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。

希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。

​ 虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(表级锁)

一、什么是表级锁

表级锁是MySQL中对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

二、什么时候适合加表级锁

1、事务需要更新某张大表的大部分或全部数据。如果使用默认的行锁,不仅事务执行效率低,而且可能造成其它事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高事务执行速度;

2、事务涉及多个表,比较复杂,可能会引起死锁,导致大量事务回滚,可以考虑表锁避免死锁。

3、表级锁更适合于以查询为主,并发用户少,只有少量按索引条件更新数据的应用,如Web 应用

其中表锁又分为表读锁和表写锁,命令分别是:
表读锁:

lock tables 表名 read;

表写锁:

lock tables 表名  write;

解锁:释放锁只能释放我们手动使用LOCK 加的锁, 不能释放死锁等其他情况的事物锁等

UNLOCK TABLES; 

三、实战演练

通过一个示例演示如何找出谁持有表级锁。

3.1 数据准备(如果已有数据可跳过此操作)

使用sysbench准备初始化数据
创建测试数据库sysbenchdemo

create database sysbenchdemo;

在这里插入图片描述
准备测试数据:

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=8 \
--table-size=100000 \
--time=180 prepare

在这里插入图片描述

3.2 开启第一个会话,执行显式加表级锁

登录mysql数据库

use sysbenchdemo;

在这里插入图片描述

查询以下加锁线程的process id,以便后续排查过程好对应

select connection_id();

在这里插入图片描述

对sbtest1 表加表读锁

lock table sbtest1 read;

在这里插入图片描述

3.3 开启第二个会话,对该表执行update更新

登录mysql数据库

use sysbenchdemo;

在这里插入图片描述

查询线程的process id,以便后续排查过程好对应

select connection_id();

在这里插入图片描述

对该表执行update更新

update sbtest1 set pad='xxx' where id=1;

发现执行更新语句被阻塞。
在这里插入图片描述

3.4 开启第三个会话,查询线程信息

show processlist;

在这里插入图片描述
可以发现update语句在等待MDL锁(Waiting for table metadata lock)

其中OWNER_THREAD_ID: # 持有锁的内部线程ID

查看process id为 12442,12443 各自对应的内部线程ID是多少

select sys.ps_thread_id(12442);

在这里插入图片描述

process id=12442 的线程对应的内部线程ID正好为12606

select sys.ps_thread_id(12443);

在这里插入图片描述

process id=12443 的线程对应的内部线程ID正好为12607

3.5 分析

因为是等待MDL锁,所以先看看performance_schema.metadata_locks表,记录的顺序代表持有锁的时间顺序

select * from performance_schema.metadata_locks where OWNER_THREAD_ID!=sys.ps_thread_id(connection_id());

在这里插入图片描述

如下就是MDL相关的锁模式,以及对应的SQL语句

锁模式对应SQL
MDL_INTENTION_EXCLUSIVEGLOBAL对象、SCHEMA对象操作会加此锁
MDL_SHAREDFLUSH TABLES with READ LOCK
MDL_SHARED_HIGH_PRIO仅对 MyISAM 存储引擎有效
MDL_SHARED_READSELECT查询
MDL_SHARED_WRITEDML语句
MDL_SHARED_WRITE_LOW_PRIO仅对MyISAM存储引擎有效
MDL_SHARED_UPGRADABLEALTER TABLE
MDL_SHARED_READ_ONLYLOCK xxx READ
MDL_SHARED_NO_WRITEFLUSH TABLES xxx,yyy,zzz READ
MDL_SHARED_NO_READ_WRITEFLUSH TABLE xxx WRITE
MDL_EXCLUSIVEALTER TABLE xxx PARTITION BY …

从图上可知,LOCK_TYPE 为SHARED_READ_ONLY的12606 内部线程手动加了表读锁;

确认一下线程是否存在着一个没有提交的事务。

select * from information_schema.innodb_trx;

在这里插入图片描述

发现没有记录。

可以尝试着去查询一些表级别的锁信息(通过会话3查询performance_schema.table_handles表)

 select * from performance_schema.table_handles where OWNER_THREAD_ID=12606;

在这里插入图片描述

证实了12606 内部线程手动加了表读锁;但还是不知道该线程执行了什么SQL语句,可以通过performance_schema.events_statements_current表查询。

 select * from performance_schema.events_statements_current where thread_id=12606;

在这里插入图片描述

通过SQL_TEXT字段我们可以清晰地看到该线程正在执行的SQL语句是什么。

3.6 释放第一个会话的表读锁

UNLOCK TABLES; 

在这里插入图片描述

第二个会话被阻塞的语句也顺利执行了。
在这里插入图片描述

在第三个会话中查看线程情况

show processlist;

在这里插入图片描述

从图上结果可知,MDL锁被释放了。

四、总结

通过本文学习,学会了什么是表级锁以及表级锁的适用场景,通过实战演练排查表级锁问题,从理论到实战的介绍,可以加深对表级锁的理解。

五、参考

应用示例荟萃 | performance_schema全方位介绍(中)
技术分享 | MySQL 的 MDL 锁解惑
SQL进阶-查询优化- performance_schema系列三:事件记录(SQL 小虚竹)

我是虚竹哥,我们明天见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 3.0 应用组件实例

#创建一个应用实例 每个 Vue 应用都是通过用 createApp 函数创建一个新的应用实例开始的: const app Vue.createApp({ /* 选项 */ }) 该应用实例是用来在应用中注册“全局”组件的。我们将在后面的指南中详细讨论,简单的例子: const app V…

jsp学生管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 学生管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发,数据库为Mysql,使用ja…

【Docker】基础使用

目录 一、Docker简介 二、Docker核心概念 三、Docker安装 四、Docker常用操作 1. 镜像操作 2. 容器操作 3. 安装MySQL 一、Docker简介 Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖…

基于Springboot搭建java项目(二十二)——过滤器、监听器和拦截器的使用

过滤器、监听器和拦截器的使用 一、过滤器、监听器和拦截器总览 过滤器(Filter)监听器(Listener)拦截器(Interceptor)关注点web请求系统级别参数、对象Action(部分web请求)如何实现…

20230201在AIO-3568J开发板在原厂Android11下增加右键返回

20230201在AIO-3568J开发板在原厂Android11下增加右键返回 2023/2/1 8:37 百度搜索:RK3568 右键返回 Z:\rk3568_Android11.0_ap6257s\frameworks\native\services\inputflinger\reader\mapper\accumulator\CursorButtonAccumulator.cpp uint32_t CursorButtonAccumu…

【学习OpenCV4】如何学习OpenCV

OpenCV是应用非常广泛的开源视觉处理库,在图像处理、计算机视觉和自动驾驶中有着非常重要的作用。 废话不多说,我就来讲讲OpenCV的使用和学习需要怎么做吧,大家觉得有道理的可以参考一下。 我理解的学习和使用的重点在四个方面: …

PTA L1-019 谁先倒(详解)

前言:本期是关于谁先倒的详解,内容包括四大模块:题目,代码实现,大致思路,代码解读,今天你c了吗? 题目: 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方…

多模态搜索的未来:超越关键字和向量的混合搜索!

二十年前,“混合”一词仅在植物学和化学领域使用。如今,“混合”这个概念在搜索领域一片繁荣,许多搜索系统都在推出基于 AI 技术的混合搜索方案。但是,“混合搜索”是真的具有应用价值,还只是流行的一阵风呢&#xff1…

深度学习:Self-Attention与Multi-heads Attention详解

深度学习:Self-Attention与Multi-heads Attention详解IntroductionSelf - AttentionMulti-Head AttentionPosition- EncodingIntroduction Transformer 最初是由 Ashish Vaswani等人提出的一种用以完成机器翻译的 Seq2Seq 学习任务的全新网络结构,它完全…

nginx学习笔记9(小滴课堂)

业界主流高可用方案Linux虚拟服务器 LVS讲解 这部分因为需要多台虚拟机,所以我先不实操。 Keepalived核心配置讲解 echo "" > keepalived.conf是清空文件中的内容。 从机的优先级可以写的比master的优先级低一些。 准备NginxLvsKeepAlive相关软件环境 …

什么是最大子数组问题?

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注! 作者| 慕课网精英讲师 JdreamZhang 最大子数组(Max Subarray)问题,是计算机科学与技术领域中一种常见的算法问题&#…

CVE-2022-26135 Atlassian Jira Mobile Plugin SSRF漏洞分析

漏洞描述 6月29日,Atlassian官方发布安全公告,在Atlassian Jira 多款产品中存在服务端请求伪造漏洞(SSRF),经过身份验证的远程攻击者可通过向Jira Core REST API发送特制请求,从而伪造服务端发起请求,从而导致敏感信息…

【青训营】规则引擎概述和入门

本文内容总结自 字节跳动青年训练营 第五届后端组 一、规则引擎是什么 规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并且使用预定义语义模块编写业务决策。接受数据输入,解释业务规则,并且…

Python接口测试实战5(上) - Git及Jenkins持续集成

本节内容接上节内容:在框架搭建好的基础上注册Github并新建仓库使用Git上传项目Jenkins的安装Jenkins接口测试项目的配置注册Github并新建仓库Git简介Git(读音为/gɪt/。)是一个开源的分布式版本控制系统版本控制: 对项目及代码记录每次提交和修改&#…

【Docker】(六)使用network完成容器间的网络通信

1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远程镜像仓库管理镜像…

12、特征值与特征向量

目录 一、特征值和特征向量的定义 二、特征值和特征向量的相关函数 三、特征值和特征向量的计算 一、特征值和特征向量的定义 假设A是一个nn的矩阵,A的特征值问题就是找到下面方程组的解: 其中,λ为标量,V为矢量,若…

【堆的认识及其优先级队列】java代码实现,保姆级教程学习堆和优先级队列

前言: 大家好,我是良辰丫💞💞⛽,我们又见面了,前面我们讲了用链表实现的二叉树,今天我们来接触堆的概念,堆是一种特殊的二叉树,只不过咱们的对底层原理是数组&#xff0c…

大数据监控平台-Prometheus监控Hadoop

简介 本篇主要是使用jmx配合Prometheus监控大数据平台 前提 链接:https://pan.baidu.com/s/1c6nsjOKw4-a_Wqr82l0QhQ 提取码:yyds --来自百度网盘超级会员V5的分享 先安装好Prometheus Flink(Pometheus监控)_顶尖高手养成计划的博客-CSDN博客_${en…

金融实践 | 信创存储 打造安全可控的金融数据底座

本文刊登于《金融电子化》杂志 2023 年 1 月上,作者为中国出口信用保险公司信息科技部张倩,曲文非,庞松松,康达。 2022 年初,中国人民银行《金融科技发展规划(2022—2025 年)》和银保监会《关于…

JAVA语言实验 实验 ( 二 )

JAVA语言实验 :实验 ( 一 ) JAVA语言实验 :实验 ( 二 ) JAVA语言实验 :实验 ( 三 ) 一、实验目的 (1)熟悉 Java 图形界面的基本设计。 (2)熟悉 Java 界面的菜…