| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL Innodb引擎锁的分类及死锁排查 -> 正文阅读 |
|
[大数据]MySQL Innodb引擎锁的分类及死锁排查 |
? 1、概览??在实际工作过程中遇到了数据库死锁的问题,在查阅资料的时候遇到了各种锁的概念。
2、锁的分类2.1、从产生锁的行为来划分2.1.1、共享锁??又被称为读锁、S锁等,事务在对数据进行查询,需要先获取数据的共享锁 2.1.2、排它锁??又被称为写锁、X锁等,事务在对数据进行修改时,需要先获取数据的排它锁 2.1.3、注意??这里“需要先获取数据的共享锁、排它锁”不代表说操作哪条数据,就只锁哪条数据,有可能只操作一条数据,但却锁了某个数据区间、甚至是整张表。锁的范围见下方解释 2.1.4、互斥关系??共享锁和排它锁的兼容和互斥关系想必大家都清楚,这里还是做个简单说明:
2.2、从锁的范围来划分2.2.1、表锁??即整张表的数据都被锁定了。 产生场景??sql执行语句没有合理的构建索引; 2.2.2、行锁??即只锁定一行的数据。 产生场景
2.2.3、间隙锁;??即只锁定一个区间(间隙)的数据,这个产生场景最多,所以放在最后特别说明。 产生场景
2.2.4、锁定的范围??既然间隙锁锁定的是一个区间,那么这个区间是如何划分的呢? ??根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,如果找不到记录值A,则左区间为无限小; ??向右寻找最靠近检索条件的记录值B,作为右区间,如果找不到记录值B,则右区间为无限大 ??详细说明可以参考这里:https://blog.csdn.net/sfh2018/article/details/121016466,后续测试模拟的表格结构也参考自这里 3、测试模拟??平常学习中可以自行建表模拟事务的执行,虽然不难,但还是在这里说明下,以Navicat为例: 3.1、开启事务??新开一个sql执行界面运行命令,即可开启一个事务
3.2、测试表结构如下
4、死锁问题排查4.1、简单方式处理??查询现在的死锁线程,然后强制杀死线程。线程id为第一步中查询到的trx_mysql_thread_id的值
??以上的方法只是解决掉了当前存在的死锁情况,并未从根本上解决死锁的产生。因此还需要进行死锁日志的查询,判断出导致死锁是哪些业务产生的,然后针对性的进行修改。 4.2、死锁日志分析4.2.1、执行命令
4.2.2、得到日志文本??navicate显示结果如下,没法直接浏览,直接选中返回结果,复制内容到文本编辑器即可 4.2.3、日志读取方法??大家看到日志时估计是非常的头大,可能有1000多行的奇奇怪怪的内容,直接就放弃了。其实我们只需要注意关键字即可。 4.2.3.1、精简之后的日志4.2.3.2关键字说明
??明白了以上的关键字之后,就能够很明白的知道哪些表之间产生了死锁,此时就可以根据实际的业务修改代码或者sql逻辑解决死锁问题了。例如上面的图示,就是两个事务互相持有了对方所需要的锁,互相等待对方释放锁,因此产生了死锁问题。 5、死锁问题解决??首先是老生常谈的产生死锁的四个条件:互斥条件、请求和保持条件、不可剥夺条件、循环等待条件。那么就有以下的消除死锁的方法: 5.1、减小事务粒度??我们经常在代码中一个方法就是一个事务,而一个方法中可能会有多条的sql操作,此时就应该分析,这些sql是否可以拆分到不同的方法中,用不同的事务去承载,由此就可以减少死锁出现的概率。 5.2、添加索引??这个应该是最简单高效的方法,这种方式可以让进行sql操作时尽量产生的是行锁或间隙锁,避免产生表锁进而形成死锁。 5.3、修改sql操作顺序??有时因sql操作顺序不合理,会导致事务互相持有对方需要的锁,此时就需要调整sql执行的顺序,合理规划sql锁资源请求步骤。 5.4、总结??本文从锁的概念出发,基于实际工作情况对一些概念性问题进行了精简。所以如果有遗漏或错误欢迎大家指正。本文参考的博客如下:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 7:55:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |