mysql 查看锁_SQL-mysql锁等待与死锁

28c58bbc58699e9d07ece22da7f744dd.png

一 前言

本篇是MYSQL高级进阶篇内容第二篇,学习本篇的基础是知识追寻者之前发布过的文章,尤其是《MYSQL架构入门篇》重中之重;

《SQL-你真的了解什么SQL么?》

《SQL-小白最佳入门sql查询一》

《SQL-小白最佳入门sql查询二》

《SQL- 多年开发人员都不懂的插入与更新删除操作注意点》

《SQL-SQL事物操作》

《SQL-Mysql数据类型》

《SQL-mysql视图的前世今生》

《SQL-mysql储存过程》

《SQL-mysql游标与触发器》

《SQL-mysql用户权限管理》

《SQL-mysql架构入门》

公众号:知识追寻者

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

二 锁等待

锁等待的意思非常好理解,就是session (事物会话,开启一个事物代表一个会话)A 对 某行数据获取独占锁(在这边一般就是写锁),然后session B 对相同的行进行获取独占锁就发生了锁等待;简单理解就是 小孩子抢玩具,谁先抢到 谁 先玩,没抢到的玩具的孩子只能 等待 抢到玩具孩子玩腻了再给你,瞬间泪奔有木有,就是这么残酷,当然MYSQL 没 这么残忍 其 还是有一个保留参数 innodb_lock_wait_timeout 指定死锁 的时间,如果超过 死锁等待时间就是报异常;

知识追寻者 做个实验:

session A 执行如下语句,开启事物,更新索引为1 的语句;此时 session A 获取了 id= 1 这条 语句的 写锁权限;

BEGIN;
update  `order` set `year`= '2022' where id = '1';

session B 执行如下 语句 , 跟 上面的语句一样 ,由于 id =1 这条数据的写锁已经被session A 获取,故会发生锁等待的情况;

BEGIN;
update  `order` set `year`= '2022' where id = '1';

知识追寻者这边默认等待了50秒 就报了如下异常

Lock wait timeout exceeded; try restarting transaction

查看 默认锁等待 语句

show  VARIABLES like  'innodb_lock_wait_timeout'

三 死锁

3.1 死锁的产生

死锁 就是 两个以上的会话 在 抢占 资源过程中 ,产生相互等待的情况;有点绕是不是,其实很简单 死锁是建立在 锁等待的基础上,session A 获取 id = 1 的写锁 , session B 获取 id =2 的写锁 ,此时由于索引不同,故不会长生锁等待现象 ; 当 session A 尝试 获取 id =2 的 写锁时 ,由于 id = 2 写锁已经被 session B 获取 ,故产生锁等待;当 session B 尝试 获取 id = 1 的写锁时 ,由于id =1 写锁已经被 session A 获取, 此时 产生锁等待; 由于 session A 与 session B 同时 都在 锁 等待状态,产生了等待对方释放锁,故会产生死锁;

知识追寻者做个试验

session A 执行语句, 获取 id =1 的 写锁权限;

BEGIN;
update  `order` set `year`= '2022' where id = '1';

session B 执行语句, 获取 id =2 的 写锁权限;

BEGIN;
update `order` set `year`= '2022' where id = '2';

session A 执行语句, 尝试获取 id =2 的 写锁权限,进入锁等待状态

update `order` set `year`= '2022' where id = '2';

session B 执行语句, 尝试获取 id =1 的 写锁权限,进入锁等待状态

update  `order` set `year`= '2022' where id = '1';

当 B 进入 锁等待后就直接报死锁异常

Deadlock found when trying to get lock; try restarting transaction

3.2 查看死锁

可以使用 show engine innodb status 查看死锁

......
*** (1) TRANSACTION: // 事物A
TRANSACTION 253507, ACTIVE 474 sec starting index read
mysql tables in use 1, locked 1 // 已经使用一个锁
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 17001, OS thread handle 139824777217792, query id 2191731 ......
root updating
update `order` set `year`= '2022' where id = '2'//执行得语句
*** (1) WAITING FOR THIS LOCK TO BE GRANTED: // 等待锁释放获取锁
RECORD LOCKS space id 65 page no 3 n bits 80 index PRIMARY of table `zszxz`.`order` trx id 253507 lock_mode X locks rec but not gap waiting
.....
​
*** (2) TRANSACTION: // 事物 B
TRANSACTION 253508, ACTIVE 425 sec starting index read
mysql tables in use 1, locked 1 // 已经使用一个锁
3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 17002, OS thread handle 139824778569472, query id 2191735 ......
root updating
update  `order` set `year`= '2022' where id = '1'//执行得语句
*** (2) HOLDS THE LOCK(S): //持有锁
RECORD LOCKS space id 65 page no 3 n bits 80 index PRIMARY of table `zszxz`.`order` trx id 253508 lock_mode X locks rec but not gap
......
​
*** (2) WAITING FOR THIS LOCK TO BE GRANTED: // 等待锁释放获取锁
RECORD LOCKS space id 65 page no 3 n bits 80 index PRIMARY of table `zszxz`.`order` trx id 253508 lock_mode X locks rec but not gap waiting
......
​

不得不说下字母代表锁得类型如下

  • 共享锁(S)
  • 排他锁(X)
  • 意向共享(IS)
  • 意向排他(IX)
  • gap lock(GK), 间隙锁,锁定一个范围,不包括当前记录本身;
  • RECORD LOCKS 代表记录锁;

可以看见上面得语句 (1) 代表 事物A ,MYSQL 线程id 17001 ; (2) 代表事物B, MYSQL 线程id 17002 ; 事物 A 与B 都在等待 对方释放锁 ,产生了死锁;

Tip; 查看表锁 : show status like 'table%';

如何解决死锁,知识追寻者这边给个思路:

查找到死锁线程,杀死MYSQL死锁的线程(kill命令);

如果事物未提交,直接回滚事物;

3.3 如何避免死锁

  • 在死锁容易产生得表使用表锁不会产生死锁;
  • 避免交叉使用相同的锁

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

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

相关文章

easyui datagrid java_EasyUI DataGrid 显示不了数据????

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Struts2:text/htmlaction:public String getList() throws Exception {// TODO Auto-generated method stubLong count (long) recruitBiz.countRecruitInfo();List list recruitBiz.findRecruitBySearch(page,rows, null);JSONO…

sed 手册阅读笔记转

原文链接sed 手册阅读笔记摘要sed 手册本身不太适合初学者,我在看的过程中加了一些 自己的注释和一些例子,帮助理解,如有偏差或错误,请指出,多谢。目录1. sed的工作原理 2. sed中如何选择特定的行 3. sed的命令行选项 …

java -cp 引用多个包_Java -cp 命令行引用多个jar包的简单写法(Windows、Linux)

1、Windows下用法在Windows上,可以使用java your-jar-lib-fold/* your-main-classyour-jar-lib-fold为存放一堆jar文件的路径。your-main-class为要运行的具有main方法的主类。JDK 1.7及以上版本支持该写法。2、Linux下用法在Linux上,这样写似乎并不支持…

python bytearray转为byte_Python3 bytearray() 函数详解 将参数转为可变的字节数组

Python3 bytearray() 函数详解 将参数转为可变的字节数组bytearray()函数的主要用途是将参数转换为一个新的字节数组&#xff0c;它是一个可变的整数序列&#xff0c;它的取值范围是0 < x < 256(0~255)&#xff0c;它具有可变序列的大多数方法。它是Python的内置函数&…

第三方库添加记录

1 ASIHTTPRequest&#xff1a; a.下载asihttprequest b.  把Classes里的文件&#xff0c;拖到XCode中  External/Reachbility也拖进去 ->这是Apple 官方用来检查网络链接是否正常的类库 c.导入框架  SystemConfiguration.framework  MobileCoreServices.framewo…

python数据标准类型_Python的标准数据类型(下)

Python的标准数据类型(下)上一篇我们讲述了 Number String List 。这一篇我们将继续学习Python的标准数据类型 。 循序渐进&#xff0c;逐渐深化。1TupleTuple(元组)Tuple 元组与列表类似不过元组的元素不能修改元组写在小括号里 ()元素之间用逗号隔开元组的元素类型也可…

mysql connetor_python mysqlconnetor

python mysqlconnetor的使用1.[代码][Python]代码# !/usr/bin python#--*-- coding:utf-8 --*--import mysql.connectorimport osimport codecs#设置数据库用户名和密码user;#用户名pwd;#密码host;#ip地址db;#所要操作数据库名字charsetUTF-8cnx mysql.connector.connect(user…

(转)HBase二级索引与Join

二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性。RDBMS支持得比较好&#xff0c;NOSQL阵营也在摸索着符合自身特点的最佳解决方案。 这篇文章会以HBase做为对象来探讨如何基于Hbase构建二级索引与实现索引join。文末同时会列出目前已知的包括0.19.3版secondary…

python编程基础题答案_大学moocPython编程基础题目及答案

情境领导理论中提到的成熟度包括()A&#xff0e;生理成熟度B&#xff0e;心理成熟度C&#xff0e;年龄成熟度D&#xff0e;工作成熟度E&#xff0e;技能成要显示当前过程中的所有变量及对象的取值&#xff0c;可以利用 ______ 窗口。A&#xff0e;监视B&#xff0e;调用堆栈C&a…

mysql主要的收获_MySQL性能测试大总结

以下的文章主要是介绍MySQL性能测试的结论&#xff0c;我们大家都知道MySQL数据库在实际实用度主要是取决于MySQL数据库的性能&#xff0c;以下的文章主要就是对MySQL性能测试的一个总结&#xff0c;望你看完之后会有所收获。好像是zdnet的实验室做得一个权威测试吧sqlserver在…

linux 下 安装 matplotlib 版本依赖(旧版本)

REDHAT 5.3 平台下 经多次报错后确认 下列版面安装未报错 gcc 4.1.2 Python 2.4.3 numpy-1.3.0 (http://cdnetworks-kr-1.dl.sourceforge.net/project/numpy/NumPy/1.3.0/numpy-1.3.0.tar.gz) matplotlib-0.91 &#xff08; from github &#xff09; ipython…

python discuz搜索api_python如何模拟搜索引擎分词

大家知道python非常的强大&#xff0c;特别针对seo也非常的有用。1、python可以自动收集与处理信息&#xff0c;比如文章标题与内容2、python可以自动登录后台发布文章之前有写过相关利用python采集信息的文章&#xff0c;这里就不多说了&#xff0c;今天说一下怎么利用python分…

java微信支付代码_Java微信支付之服务号支付代码示例

Java微信支付之服务号支付实现&#xff0c;网上的java微信支付sdk和Demo基本上是水的&#xff0c;看着头疼所以我决心自己开始写Java微信支付之公众号支付&#xff0c;多的不说见下面源码&#xff0c;为了方便使用我分别用了两个Servlet&#xff0c;一个是统一下单Unifiedorder…

朴素贝叶斯分类器python_朴素贝叶斯分类器及Python实现

贝叶斯定理贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理&#xff0c;在概率论中具有重要地位。先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布&#xff0c;后验概率(条件概率)是根据样本分布和未知参数的先验概率分布求得的条件概率…