首页 > 数据库 >mysql死锁问题排查SOP

mysql死锁问题排查SOP

时间:2023-07-06 12:34:25浏览次数:34  
标签:lock hex len asc SOP 死锁 mysql id

步骤1:查看写库的隔离级别

# 查看隔离级别
show variables like '%tx_isolation%'

或者

select @@global.tx_isolation
select @@session.tx_isolation

如果隔离级别为RC,则只有行锁,没有间隙锁。死锁概率会降低很多。

步骤2:查看最近一次的死锁

show engine innodb status

这个命令可以查看很多信息,包括最近一次的死锁日志。

步骤3:死锁日志解读

下面结合具体示例解读死锁日志。

LATEST DETECTED DEADLOCK
------------------------
2023-07-06 01:17:36 140215730644736  
*** (1) TRANSACTION:  // 事务1有关的信息
TRANSACTION 1860, ACTIVE 48 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1128, 2 row lock(s), undo log entries 1
MySQL thread id 8, OS thread handle 140216059787008, query id 61 localhost root updating
update user_account set money = 110 where id = 3 // 事务1正在执行的语句

*** (1) HOLDS THE LOCK(S):  // 事务1持有的锁
RECORD LOCKS space id 3 page no 4 n bits 72 index PRIMARY of table `chris`.`user_account` trx id 1860 lock_mode X locks rec but not gap  
// PRIMARY 主键索引,lock_mode X locks rec but not gap,X锁,行锁中的记录锁(不是间隙锁)
Record lock, heap no 5 PHYSICAL RECORD: n_fields 7; compact format; info bits 64
 0: len 4; hex 80000001; asc     ;;
 1: len 6; hex 000000000744; asc      D;;
 2: len 7; hex 0200000113044d; asc       M;;
 3: len 4; hex 8000006f; asc    o;;
 4: len 4; hex 80000001; asc     ;;
 5: len 4; hex 80000000; asc     ;;
 6: len 4; hex 8000005a; asc    Z;;


*** (1) WAITING FOR THIS LOCK TO BE GRANTED:  // 事务1等待的锁
RECORD LOCKS space id 3 page no 4 n bits 72 index PRIMARY of table `chris`.`user_account` trx id 1860 lock_mode X locks rec but not gap waiting
// PRIMARY 主键锁,lock_mode X locks rec but not gap 代表 记录排他锁,不是间隙锁
Record lock, heap no 6 PHYSICAL RECORD: n_fields 7; compact format; info bits 64
 0: len 4; hex 80000003; asc     ;;
 1: len 6; hex 000000000745; asc      E;;
 2: len 7; hex 010000011503e9; asc        ;;
 3: len 4; hex 8000014d; asc    M;;
 4: len 4; hex 80000002; asc     ;;
 5: len 4; hex 80000000; asc     ;;
 6: len 4; hex 8000006e; asc    n;;


*** (2) TRANSACTION: // 事务2有关的信息
TRANSACTION 1861, ACTIVE 34 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1128, 2 row lock(s), undo log entries 1
MySQL thread id 9, OS thread handle 140216058730240, query id 62 localhost root updating
update user_account set money = 90 where id = 1 // 事务2正在执行的语句

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 3 page no 4 n bits 72 index PRIMARY of table `chris`.`user_account` trx id 1861 lock_mode X locks rec but not gap
// PRIMARY 主键锁,lock_mode X locks rec but not gap 代表 记录排他锁,不是间隙锁
Record lock, heap no 6 PHYSICAL RECORD: n_fields 7; compact format; info bits 64
 0: len 4; hex 80000003; asc     ;;
 1: len 6; hex 000000000745; asc      E;;
 2: len 7; hex 010000011503e9; asc        ;;
 3: len 4; hex 8000014d; asc    M;;
 4: len 4; hex 80000002; asc     ;;
 5: len 4; hex 80000000; asc     ;;
 6: len 4; hex 8000006e; asc    n;;


*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 3 page no 4 n bits 72 index PRIMARY of table `chris`.`user_account` trx id 1861 lock_mode X locks rec but not gap waiting
// PRIMARY 主键锁,lock_mode X locks rec but not gap 代表 记录排他锁,不是间隙锁

Record lock, heap no 5 PHYSICAL RECORD: n_fields 7; compact format; info bits 64
 0: len 4; hex 80000001; asc     ;;
 1: len 6; hex 000000000744; asc      D;;
 2: len 7; hex 0200000113044d; asc       M;;
 3: len 4; hex 8000006f; asc    o;;
 4: len 4; hex 80000001; asc     ;;
 5: len 4; hex 80000000; asc     ;;
 6: len 4; hex 8000005a; asc    Z;;

*** WE ROLL BACK TRANSACTION (2)
持有 等待
事务1 id=3主键索引的锁
事务2 id=1主键索引的锁

从日志可以看出,应该是有两个事务相互等待,造成了死锁。最终,回滚了事务2。

步骤4:梳理业务代码,梳理SQL执行顺序

根据造成死锁的SQL,我们得梳理代码,看看是哪个业务逻辑。

步骤5:结合应用日志打印,分析原因

步骤6:降低死锁概率

在RC隔离级别下,降低死锁的措施有:

  • 尽量不使用大事务,减少锁定时间,降低死锁概率
  • 采用固定的顺序来加锁和释放锁
  • 一个大事务中,将涉及加锁的操作放到最后

标签:lock,hex,len,asc,SOP,死锁,mysql,id
From: https://www.cnblogs.com/phenixlife/p/17523721.html

相关文章

  • MySQL各指标监控查询
    对于当前数据库的监控方式有很多,分为数据库自带、商用、开源三大类,每一种都有各自的特色;而对于mysql数据库由于其有很高的社区活跃度,监控方式更是多种多样,不管哪种监控方式最核心的就是监控数据,获取得到全面的监控数据后就是灵活的展示部分。那我们今天就介绍一下完全采用mysql......
  • 记一次.Net分布式事务死锁现象以及解决方法
    在本文中,将介绍一次遇到的.Net分布式事务死锁现象以及解决方法。我们将首先了解事务框架的构成,然后分析导致死锁的代码,最后提出解决方法。事务框架本次开发框架JMSFramework将分布式事务划分为4个阶段,分别是:执行、确认、提交和重试。1、执行调用微服务来执行相关的业务操作。......
  • Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications lin
    2023-07-061、问题描述测试mybatis-plus代码功能的时候出现Causedby:com.mysql.cj.exceptions.CJCommunicationsException:Communicationslinkfailure问题2、问题解决通过查阅,发现,这个是数据库连接的问题。打开navicat连接数据库,发现连接不上。因此需要看数据库服务是否......
  • MySQL创建默认当前时间字段
    MySQL创建一个时间字段默认当前时间,插入数据时无需给这个字段添加值,会自动默认当前时间类型:timestamp,默认值:CURRENT_TIMESTAMP ......
  • mysql分库分表 sharding-jdbc 5.0的代码实现 (二)
    分库分表之前试过了分表不分库,详情见:https://www.cnblogs.com/expiator/p/17524493.html这次再试下分库分表。依赖包SpringBoot用的是2.6.13版本。<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-......
  • mysql版本升级,升级成为8.0.32
    一、升级的方式和注意事项 1、同版本升级 简称本地升级 高版本数据库挂载低版本数据库数据实现升级2、升级注意事项  备份关键数据库文件 备份指定数据库的指定表数据二、部署Mysql5.6数据库,在Mysql5.6创建数据库名字data,创建表student设计表结构,插入个人记录和两条......
  • MySQL安装部署
    禁用SELinux:方法一:vi/etc/selinux/config SELinux=disabled方法二:sed-i'/^SELINUX=/cSELinux=disabled'/etc/selinux/config setenforce0//设置为宽容(警告)模式四种方法安装MySQL:方法一:yum仓库安装 --测试开发环境 在线安装: yuminstallhttp://dev.m......
  • 浅分析MySQL架构图
    MySQL架构大致可以分为4层:客户端、server层、存储引擎层、物理文件层客户层:为各种语言提供连接MySQL的方法server层:包括连接器、查询缓存、分析器、优化器、执行器等,涵盖mysql的大多数核心服务功能,以及所有的内置函数,所有跨存储引擎的功能都在这一层实现。数据存储层:负责数据的......
  • Nacivate 连接远程mysql时 报错 Lost connection to MySQL server at ‘reading initi
    出现这种报错首先要检查第一:查看mysql的配置文件 /etc/my.cnf,根据服务器的不同以及安装的mysql版本有的是配置文件/etc/mysql/conf.d/50.server.confstep1:注释bind-address=127.0.0.1这句step2:找到[mysqld]部分的参数,在配置后面建立一个新行,添加skip-name-resolve......
  • mysql学习命令(持续更新)
    1、基本命令行createdatabaseking_db;创建一个数据库showdatabases;显示数据库useking_db;使用数据库createtabletbl_user(u_idintprimarykeyauto_increment,u_namevarchar(32),u_gengdervarchar(8));这里可以养成一个好习惯,在创建用户前面加TBL,别人就知道......