美文网首页
MySQL死锁问题排查

MySQL死锁问题排查

作者: 史啸天 | 来源:发表于2021-06-22 18:08 被阅读0次

概述

在开发中经常用到的mysql数据库,mysql作为开源的数据库有很多优越的地方;大家可以不了解其中的原理,但是一定需要具备排查问题的基本功,例如死锁问题。

死锁的产生

在这里我们简单模拟一个死锁

表结构:
CREATE TABLE `song_rank` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `songId` int(11) NOT NULL,
 `weight` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`),
 UNIQUE KEY `songId_idx` (`songId`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
查看下隔离级别
mysql>select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
关闭自动提交
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)
查看数据
mysql> select * from song_rank;
+----+--------+--------+
| id | songId | weight |
+----+--------+--------+
|  1 |     10 |     30 |
|  2 |     20 |     30 |
+----+--------+--------+
死锁模拟

第一个客户端执行

mysql> begin;    //第一步
Query OK, 0 rows affected (0.00 sec)

mysql> insert into  song_rank(songId,weight) values(15,100) on duplicate key update  weight=weight+1;  //第二步
Query OK, 1 row affected (0.00 sec)

mysql> rollback;   //第七步
Query OK, 0 rows affected (0.00 sec)

第二个客户端执行

mysql> begin;   //第三步
Query OK, 0 rows affected (0.00 sec)

mysql> insert into  song_rank(songId,weight) values(16,100) on duplicate key update  weight=weight+1;  //   第四步
Query OK, 1 row affected (40.83 sec)

第三个客户端执行

mysql> begin;  //第五步
Query OK, 0 rows affected (0.00 sec)

mysql> insert into  song_rank(songId,weight) values(18,100) on duplicate key update  weight=weight+1; //第六步

死锁查看

1、查看死锁日志

show engine innodb status;

在LATEST DETECTED DEADLOCK栏中可以看到死锁的日志
2、正在发生的死锁查看

// 查看产生的锁
select * from information_schema.innodb_locks;
// 查看持有的锁
select * from sys.innodb_lock_waits

3、设置锁的等待时间

// 查看锁等待时间
show variables like 'innodb_lock_wait_timeout';
// 设置锁超时等待时间是10秒
set global innodb_lock_wait_timeout=10;

总结

从上面的案例我们可以看出,mysql是默认的锁超时时间是50秒,当发生死锁后,事务等待超过50秒后会抛出一个错误;

相关文章

  • MySQL死锁问题排查

    概述 在开发中经常用到的mysql数据库,mysql作为开源的数据库有很多优越的地方;大家可以不了解其中的原理,但...

  • Mysql死锁如何排查:insert on duplicate死

    前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问...

  • mysql简单排查&终止死锁线程 2022-03-29

    mysql简单排查&终止死锁线程 INFORMATION_SCHEMA MySQL把INFORMATION_SCH...

  • mysql 死锁排查

    一、show ENGINE INNODB status查看死锁位置,分析。 二、首先解决死锁可以从死锁发生的条件入...

  • mysql 死锁排查

    1、当出现事务执行阻塞时,首先想到查询当前MySQL进程状态: 2、查看当前的死锁线程id和导致的sql 3、条件...

  • MySQL死锁排查

    执行简单的update语句失效:报错 Lock wait timeout exceeded; try restar...

  • MySQL死锁系列-线上死锁问题排查思路

    前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日渐复杂,各种业务操作之间往往会产生锁冲突,...

  • 死锁问题排查

    首先使用jps查询进程ID然后使用jstack和进程ID查询堆栈日志信息。

  • 死锁问题排查

    最近在处理现场问题中偶然发现从日志中发现事务间死锁,与以往认知不大相符,故而进行记录。1.死锁死锁一般指的是两个事...

  • Mysql死锁监控排查

    死锁监控

网友评论

      本文标题:MySQL死锁问题排查

      本文链接:https://www.haomeiwen.com/subject/gfemyltx.html