文章目录

  • 生猛干货
  • 版本信息
  • MySQL 行锁分析
  • MySQL死锁演示
  • 排查过程
  • 查看近期死锁日志信息
  • 查询锁等待命令及kill 锁
  • 优化建议
  • 搞定MySQL

生猛干货

带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试


版本信息

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.28    |
+-----------+
1 row in setmysql>

MySQL 行锁分析

mysql> show status like'innodb_row_lock%';
+-------------------------------+--------+
| Variable_name                 | Value  |
+-------------------------------+--------+
| Innodb_row_lock_current_waits | 0      |
| Innodb_row_lock_time          | 222821 |
| Innodb_row_lock_time_avg      | 27852  |
| Innodb_row_lock_time_max      | 51017  |
| Innodb_row_lock_waits         | 8      |
+-------------------------------+--------+
5 rows in setmysql>

变量说明:

  • Innodb_row_lock_current_waits 当前正在等待锁定的数量 单位毫秒
  • Innodb_row_lock_time 从系统启动到现在锁定总时间长度 单位毫秒
  • Innodb_row_lock_time_avg 每次等待所花平均时间 单位毫秒
  • Innodb_row_lock_time_max 从系统启动到现在等待最长的一次所花时间 单位毫秒
  • Innodb_row_lock_waits 系统启动后到现在总共等待的次数

重点关注 : Innodb_row_lock_time_avg 、Innodb_row_lock_waits 、Innodb_row_lock_time


MySQL死锁演示

事务隔离级别, 默认 可重复读

mysql> show variables like '%tx_isolation%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in setmysql>

【操作步骤】

session1 session2
begin 模拟开启事务
select * from art_info where id=1 for update;
begin 模拟开启事务
select * from account where id=2 for update;
select * from art_info where id=2 for update; ---->一直等待
select * from art_info where id=1 for update; —> Deadlock found when trying to get lock; try restarting transaction

大多数情况mysql可以自动检测死锁并回滚产生死锁的那个事务,但是有些情况mysql没法自动检测死锁


排查过程

【模拟锁等待 】

session1 session2
begin 模拟开启事务
select * from art_info where id=1 for update;
begin 模拟开启事务
select * from account where id=2 for update;
select * from account where id=2 for update;
mysql> select * from art_info where id =2 for update ;
1205 - Lock wait timeout exceeded; try restarting transaction

-- 查看事务
select  * from information_schema.INNODB_TRX;
-- 查看锁
select * from information_schema.INNODB_LOCKS;
-- 查看锁等待
select * from information_schema.INNODB_LOCK_WAITS;-- 锁释放  information_schema.INNODB_TRX  查询 trx_mysql_thread_id 然后去 kill 对应的value
kill  trx_mysql_thread_id

来吧 ,用上面的SQL查吧


查看近期死锁日志信息

show engine innodb status \G;


查询锁等待命令及kill 锁

-- 查看事务
select  * from information_schema.INNODB_TRX;
-- 查看锁
select * from information_schema.INNODB_LOCKS;
-- 查看锁等待
select * from information_schema.INNODB_LOCK_WAITS;-- 锁释放  information_schema.INNODB_TRX  查询 trx_mysql_thread_id 然后去 kill 对应的value
kill  trx_mysql_thread_id

锁等待有自己的超时时间,超过后一般都会自动释放

mysql> select * from art_info where id =2 for update ;
1205 - Lock wait timeout exceeded; try restarting transaction

优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能减少检索条件范围,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
  • 尽可能低级别事务隔离

搞定MySQL

MySQL - 锁等待及死锁初探相关推荐

  1. 10、MySQL锁等待,死锁,死锁检测

    使用数据库时,有时会出现死锁.对于实际应用来说,就是出现系统卡顿. 死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象.就是所谓的锁资源请求产生了回路现象,即死循环,此时称 ...

  2. MySQL锁等待分析【2】

    MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...

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

    一 前言 本篇是MYSQL高级进阶篇内容第二篇,学习本篇的基础是知识追寻者之前发布过的文章,尤其是<MYSQL架构入门篇>重中之重: <SQL-你真的了解什么SQL么?> &l ...

  4. mysql锁场景_MySQL死锁系列-常见加锁场景分析

    在上一篇文章<锁的类型以及加锁原理>主要总结了 MySQL 锁的类型和模式以及基本的加锁原理,今天我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能 ...

  5. mysql锁等待问题

    为什么80%的码农都做不了架构师?>>>    相关操作: update a set type=0 where id=1; 执行时提示ERROR 1205 (HY000): Lock ...

  6. MYSQL错误: ERROR 1205: Lock wait timeout exceeded(处理MYSQL锁等待)解决办法

    在运行数据库某一语句的时候(数据量大概有一亿条),运行的特别慢,可能是我自己电脑配置不高,因此想删选一些数据但是运行的时候报1205错误. 原因 有会话执行过DML操作,然后没commit提交,再执行 ...

  7. MySQL - 锁机制初探

    文章目录 生猛干货 Pre 锁的分类 InnoDB 中的锁 行锁 InnoDB 行锁的三种算法实现 Record Lock 锁 Gap Lock 锁 Next-key Lock 锁 表锁 表锁的分类 ...

  8. MySQL锁机制,行锁jingran加在索引上

    锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制,应该都不陌生.?但在这之前我们先来看看并发控制,理清MVCC多版本并发控制和锁的关系,这也是之前我很迷惑的一个点 并发控制技术 在数据库中, ...

  9. mysql二级封锁协议_MySQL 行锁、两阶段锁协议、死锁以及死锁检测

    行锁 MySQL的行锁都是在引擎层实现的,但是 MyISAM 不支持行锁,意味着并发控制只能使用表锁,同一张表任何时刻只能被一个更新在执行,影响到业务并发度.InnoDB 是支持行锁的,这也是 MyI ...

最新文章

  1. TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊!
  2. BOM,DOM常见操作和DHML
  3. 揭秘!疫情下的阿里员工如何上班?
  4. 回顾build 2016:你好,这是微软迄今最好的Windows开发平台
  5. 所有的软弱,都是昂贵的
  6. django后台数据管理admin设置代码
  7. 富人和穷人的对比图,时刻提醒自己!
  8. linux下搭建nagios监控
  9. HTML5 Canvas专题
  10. 三星电视机的极光TV显示服务器异常,三星液晶电视机故障有哪些 三星液晶电视机故障解决方法【图文】...
  11. python决策树分类 导入数据集_BPNN、决策树、KNN、SVM分类鸢尾花数据集Python实现...
  12. java函数ao活动对象_JS之预编译和执行顺序(全局和函数)
  13. WebService远程调试
  14. Tweet button with a callback – How to?
  15. 我国低轨宽带通信卫星系统建设迈出了实质性的一步
  16. return的用法 java_Java中return用法.
  17. 经典论文之OverFeat
  18. PCB板检测机(PCB板外观缺陷视觉检测设备)
  19. Google的“神秘链接”
  20. 软考时间管理思维导图

热门文章

  1. linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
  2. wordpress更新时需要ftp的解决方法
  3. python 操作 hbase
  4. pyspark DataFrame 转RDD
  5. vue 改变domclass_基于 vue 开发甘特图组件的心路历程(兼设计分享)
  6. 机器学习笔记 时间序列预测(基本数据处理,Box-Cox)
  7. 机器学习笔记 时间序列预测(最基本的方法【benchmark】)
  8. Python应用实战-如何通过python对Excel进行常规性操作
  9. Linux质数合数的脚本,python输出100以内的质数与合数实例代码
  10. java 正方形字符串_java编程:怎么画一个正方形?