行锁升级表锁如何避免?表锁后如何排查?

news2024/11/25 14:24:09

一、那些场景会造成行锁升级表锁

说明:

InnoDB引擎3种行锁算法(Record Lock、Gap Lock、Next-key Lock)都是锁定的索引。

当触发X锁(写锁)的where条件 无索引 或 索引失效 时,查询的方式就变成全表扫描,也就是扫描所有的聚集索引记录。

为什么要把不匹配的记录也加锁呢?

这里针对的是默认的事务隔离级别:可重复读(RR),因为要解决 不可重复读 和 幻读问,所以在遍历扫描聚集索引记录时,为了防止扫描过的索引被其他事务修改(不可重复读问题) 或 间隙被其他事务插入记录(幻读问题),从而导致数据不一致,所以MYSQL的解决方案就是 把所有扫描过的索引记录和间隙都锁上,这时也就出现了我们看到的锁表。

无索引:

例如下面的sql,remark 列不是索引列,如果按照remark列更新就是无索引更新

UPDATE user_info SET user_name = 'keke' WHERE remark = 'keke1'

索引失效:

explain验证:

索引失效的场景很多,我们可以用explain验证:

explain 返回的 key 不是你期望的索引,而是primary;

explain 返回的 type 是 index 或 all

MYSQL成本计算分析认为全表扫描成本更低时:

同样的SQL,传入的参数不同,explain 的结果也不同,有时会走索引、有时索引又会失效!

这里的原因是:更具传入的入参不同、导致 结果集不同。再正式扫描前、MYSQL会进行成本计算。计算走那个索引快,就算命中了索引,但是发现还不如全表扫描快,那么也会不走索引,而是进行全表扫描,这时就会导致索引失效!

关于成本计算:它是先计算不同索引的I/O成本 和 CPU成本,然后进行对比,那个成本低就选择那个执行!

二、如何避免:

1.禁止 WHERE 条件使用无索引列进行 更新/删除

2.尽可能使用聚集索引进行更新/删除

3.如果确实需要用到 非聚集索引进行更新/删除时:

使用explain检测索引是否会失效

避免对索引列进行 类型转换、函数、运算符等会造成升级的操作!

尽可能减少检索条件范围,范围越大就越可能被MySQL成本计算太高,从而导致索引失效!

4.尽可能控制事务的大小、减少锁定的时间

5.使用读已提交(RC)事务隔离级别

读已提交(RC)事务隔离级别,由于没有间隙锁(Gap Lock),所以它的加锁规则相对简单,都是针对匹配索引记录加的Record Lock、因为不用解决 不可重复读 和 幻读 问题,所以也就不存在 锁表了

三、锁表应该如何分析排查

查看InnoDB_row_lock%相关变量

show status like 'innodb_row_lock%';

字段

说明

Innodb_row_lock_current_waits

当前正在等待锁定的数量

Innodb_row_lock_time

等待总时长: 从系统启动到现在锁定总时间长度

Innodb_row_lock_time_avg

等待平均时长: 每次等待所花平均时间

Innodb_row_lock_time_max

从系统启动到现在等待最长的一次所花时间

Innodb_row_lock_waits

等待总次数: 系统启动后到现在总共等待的次数

四、查看 INFORMATION_SCHEMA系统库

可以通过 INFORMATION_SCHEMA系统库提供的:查看事务、锁、锁等待的 数据表 来分析

系统表

说明

INNODB_TRX

查看事务

INNODB_LOCKS

查看锁

INNODB_LOCK_WAITS

查看锁等待

PROCESSLIST

查看连接情况

INNODB_TRX:

下面对 innodb_trx 表的每个字段进行解释:

字段

说明

trx_id

事务ID。只读事务和非锁事务是不会创建id的

trx_state

事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING

trx_started

事务开始时间

trx_requested_lock_id

事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息

trx_wait_started

事务开始等待的时间

trx_weight

事务的权重。代表修改的行数和被事务锁住的行数。为了解决死锁,innodb会选择一个高度最小的事务来当做牺牲品进行回滚。已经被更改的非交易型表的事务权重比其他事务高,即使改变的行和锁住的行比其他事务低。

trx_mysql_thread_id

事务线程 ID,可以和 PROCESSLIST 表 JOIN

trx_query

事务正在执行的 SQL 语句。

trx_operation_state

事务当前操作状态

trx_tables_in_use

当前事务执行的 SQL 中使用的表的个数

trx_tables_locked

当前执行 SQL 的行锁数量。因为只是行锁,不是表锁,表仍然可以被多个事务读和写

trx_lock_structs

事务保留的锁数量。

trx_lock_memory_bytes

事务锁住的内存大小,单位为 BYTES

trx_rows_locked

事务锁住的记录数。包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行

trx_rows_modified

事务更改的行数。

trx_concurrency_tickets

该值代表当前事务在被清掉之前可以多少工作,由 innodb_concurrency_tickets系统变量值指定。

trx_isolation_level

当前事务的隔离级别

trx_unique_checks

是否打开唯一性检查的标识

trx_foreign_key_checks

是否打开外键检查的标识

trx_last_foreign_key_error

最后一次的外键错误信息

trx_adaptive_hash_latched

自适应哈希索引是否被当前事务阻塞。当自适应哈希索引查找系统分区,一个单独的事务不会阻塞全部的自适应hash索引。自适应hash索引分区通过 innodb_adaptive_hash_index_parts参数控制,默认值为8

trx_adaptive_hash_timeout

是否为了自适应hash索引立即放弃查询锁,或者通过调用mysql函数保留它。当没有自适应hash索引冲突,该值为0并且语句保持锁直到结束。在冲突过程中,该值被计数为0,每句查询完之后立即释放门闩。当自适应hash索引查询系统被分区(由 innodb_adaptive_hash_index_parts参数控制),值保持为0

INNODB_LOCKS:

只有发生阻塞才会有数据,可以查看上锁的详细信息

字段

说明

lock_id

锁 ID

lock_trx_id

拥有锁的事务 ID。可以和 INNODB_TRX 表 JOIN 得到事务的详细信息。

lock_mode

锁的模式。有如下锁类型:行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。

lock_type

锁的类型

lock_table

被锁定的或者包含锁定记录的表的名称。

lock_index

当 LOCK_TYPE=’RECORD’ 时,表示索引的名称;否则为 NULL。

lock_space

当 LOCK_TYPE=’RECORD’ 时,表示锁定行的表空间 ID;否则为 NULL。

lock_page

当 LOCK_TYPE=’RECORD’ 时,表示锁定行的页号;否则为 NULL。

lock_rec

当 LOCK_TYPE=’RECORD’ 时,表示一堆页面中锁定行的数量,亦即被锁定的记录号;否则为 NULL。

lock_data

当 LOCK_TYPE=’RECORD’ 时,表示锁定行的主键;否则为NULL。

INNODB_LOCK_WAITS:

只有发生锁等待才有数据,可以通过此表找出阻塞的事务ID 和 锁ID

字段

说明

requesting_trx_id

请求的事务ID

requested_lock_id

事务所等待的锁定的 ID。可以和 INNODB_LOCKS 表 JOIN。

blocking_trx_id

阻塞的事务ID

blocking_lock_id

某一事务的锁的 ID,该事务阻塞了另一事务的运行。可以和 INNODB_LOCKS 表 JOIN。

PROCESSLIST:

可以查看连接情况,通过这张表我们可以看到事务所在的主机

字段

说明

ID

线程ID, 可以JOIN INNODB_TRX.trx_requested_lock_id

USER

连接用户

HOST

连接主机 ip:port

DB

连接的数据库

五、如何kill某个事务:

通过对上面的表进行查询, 当我们发现某个事务阻塞了很多事务, 并且执行时间很长时, 我们可以手动中止它。

只需要找到INNODB_TRX 表的trx_mysql_thread_id字段,然后调用kill命令即可:

kill {INNODB_TRX.trx_mysql_thread_id}

学习自:【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?_为什么断开连接避免锁表-CSDN博客

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

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

相关文章

【机器学习】科学库使用第4篇:Matplotlib,学习目标【附代码文档】

机器学习(科学计算库)完整教程(附代码资料)主要内容讲述:机器学习(常用科学计算库的使用)基础定位、目标,机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…

AI实时换天解决方案:重塑汽车与旅行拍摄新视界

在汽车拍摄与旅行摄影领域,天空作为画面中的重要元素,往往决定着整体视觉效果的成败。美摄科技作为业界领先的AI视觉技术提供商,近日推出了全新的AI实时换天解决方案,为用户带来了前所未有的创意空间与效率提升。 传统的换天技术…

【简单讲解下WebView的使用与后退键处理】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

分布式文件系统——MinIo

1. 文件系统和分布式文件系统 1.1 文件系统 文件系统是负责管理和存储文件的系统软件,操作系统通过文件系统提供的接口去存取文件,用户通过操作系统访问磁盘上的文件。 1.2 分布式文件系统 一个计算机无法存储海量的文件,通过网络将若干计算…

Xshell连接CentOS7教程

一、在CentOS7中单击右键,打开命令行终端: 二、输入ifconfig命令之后,找到CentOS的ip地址: 三、打开Xshell,命令行中输入 “ssh 用户名上述查到的ip地址 ”,之后输入密码即可连接成功: 四、测试…

【鸿蒙开发】组件状态管理@Prop,@Link,@Provide,@Consume,@Observed,@ObjectLink

1. Prop 父子单向同步 概述 Prop装饰的变量和父组件建立单向的同步关系: Prop变量允许在本地修改,但修改后的变化不会同步回父组件。当父组件中的数据源更改时,与之相关的Prop装饰的变量都会自动更新。如果子组件已经在本地修改了Prop装饰…

嵌入式开发绝招:状态机+事件驱动框架

生活中有很多事件驱动的例子,上自习瞒着老师偷睡觉就是很生动的一个。在开始前我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无…

第十四届蓝桥杯C/C++大学B组题解(二)

6、岛屿个数 #include <bits/stdc.h> using namespace std; const int M51; int T,m,n; int vis[M][M],used[M][M]; int dx[]{1,-1,0,0,1,1,-1,-1}; int dy[]{0,0,1,-1,1,-1,1,-1}; string mp[M]; struct node{//记录一点坐标 int x,y; }; void bfs_col(int x,int y){ qu…

基于BP神经网络的时间序列预测模型matlab代码

整理了基于BP神经网络的时间序列预测模型matlab代码&#xff0c;包含数据集。采用了四个评价指标R2、MAE、MBE、MAPE对模型的进行评价。BP模型在数据集上表现优异。 代码获取链接&#xff1a;基于BP神经网络的时间序列预测模型matlab代码 训练效果&#xff1a; 训练集数据的R…

(学习日记)2024.04.11:UCOSIII第三十九节:软件定时器

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

一体式I/O模块与RS485串口联动,实现工业网络无缝对接

在现代工业自动化领域中&#xff0c;一体化I/O模块和RS485串口的联动应用已经成为实现工业设备高效、稳定通信的关键技术手段之一。这种联动机制能够有效地将各种现场设备的数据实时、准确地传输到上位机系统&#xff0c;从而实现工业网络的无缝对接。 一体化I/O模块&#xff…

HarmonyOS 开发-Grid和List内拖拽交换子组件位置

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

python|sort_values()排序

sort_value()可以用来对值&#xff08;比如说年龄&#xff09;进行排序 根据 ‘Age’ 列进行升序排序&#xff0c;如果 ‘Age’ 相同则根据 ‘Name’ 列进行降序排序 df_sorted_multi df.sort_values(by[Age, Name], ascending[True, False]) print(df_sorted_multi)

拍立淘API助力阿里巴巴1688平台:图片搜索商品更精准,实现个性化推荐新高度

在电子商务的浪潮中&#xff0c;搜索引擎一直扮演着至关重要的角色。然而&#xff0c;随着技术的不断发展和用户需求的多样化&#xff0c;传统的文本搜索方式已逐渐难以满足市场的需要。在此背景下&#xff0c;阿里巴巴1688平台引入拍立淘API&#xff0c;通过图片搜索技术&…

stress-ng ——linux下多功能压测工具,让你的服务器汗流浃背!

关于压力测试&#xff0c;主要就是模拟在 linux 上的高负载情况&#xff0c;包括 cpu、内存、磁盘、网络等&#xff0c;在这种情况下来观察高负载情况下的系统表现&#xff0c; 简单的压测&#xff0c;可以写一些计算的脚本&#xff0c;来让 cpu 和内存维持高使用率&#xff0c…

羊大师家长如何有效应对孩子游戏成瘾与未授权充值问题

在数字时代&#xff0c;青少年沉迷于网络游戏已成为家庭教育中的一大挑战。近期&#xff0c;一位父亲因未能有效监管孩子使用手机玩游戏和偷偷充值而给自己扇了十个耳光的事件在社会上引发了广泛讨论&#xff0c;凸显了青少年网络游戏成瘾和家庭教育之间的矛盾。 面对这一问题…

【数据结构与算法】:堆排序和选择排序

1. 堆排序 堆排序是一种比较复杂的排序算法&#xff0c;因为它的流程比较多&#xff0c;理解起来不会像冒泡排序和选择排序那样直观。 1.1 堆的结构 要理解堆排序&#xff0c;首先要理解堆。堆的逻辑结构是一棵完全二叉树&#xff0c;物理结构是一个数组。 (如果不知道什么是…

中间件漏洞攻防学习总结

前言 面试常问的一些中间件&#xff0c;学习总结一下。以下环境分别使用vulhub和vulfocus复现。 Apache apache 文件上传 (CVE-2017-15715) 描述: Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨…

C++ stl容器vector的认识与简单使用

目录 前言&#xff1a; 本篇文档图片引用自&#xff1a;https://cplusplus.com/reference/vector/vector/ 1.vector的结构 2.迭代器类型 3.构造函数 4.迭代器 反向迭代器遍历 const迭代器 5.容量 maxsize shrink_to_fit reverse resize 6.修改 insert和erase 7.…

【随笔】Git 高级篇 -- 相对引用1 main^(十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…