seata at模式死锁

news/2024/5/20 14:20:02 标签: seata, 死锁

背景

mysql版本为5.7,在mysql的系统表中,有一个lock_deadlocks的指标

SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE name LIKE '%deadlock%'

该指标的count值记录了数据库实例从启动到现在的死锁次数,我们通过普罗米修斯的mysql探针,采集了这个指标,制定了告警策略

https://github.com/prometheus/mysqld_exporter

线上收到死锁告警后, 发现是seata at模式所用的seata库发生的死锁,同时相应的业务系统出现阻塞卡顿情况

排查过程

先通过命令拿到死锁的信息, 拿到后恢复系统,然后慢慢查问题

show engine innodb status

拿到关键信息,日志比较长,贴一下关键点


*** (1) TRANSACTION:
delete from lock_table where xid = '172.16..:8091:440483815345885184' and branch_id in (440483816079888385,440483816235077633,440483816327356417,440483816373497857,440483816398655489,440483816746790913,440483817065558017)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 301 page no 6 n bits 144 index PRIMARY of table `seata`.`lock_table` trx id 338204135 lock_mode X waiting


*** (2) TRANSACTION:
insert into lock_table(xid, transaction_id, branch_id, resource_id, table_name, pk, row_key, gmt_create, gmt_modified) values ('172.16.22.13:8091:440483789588664320', 440483789588664320, 440483816818094081, 'jdbc:mysql://172.16..:3306/op', 't_order_agent_profit_explanation', '53641', 'jdbc:mysql://172.16..:3306/op^^^t_order_agent_profit_explanation^^^53641', now(), now())
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 301 page no 6 n bits 144 index PRIMARY of table `seata`.`lock_table` trx id 338204130 lock_mode X locks rec but not gap
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 301 page no 6 n bits 144 index PRIMARY of table `seata`.`lock_table` trx id 338204130 lock_mode X locks gap before rec insert intention waiting

我们来大概阅读一下这个死锁日志:

  1. 第一个事务执行一个delete语句,但是他在等待一个主键索引的写锁
  2. 第二个事务在执行insert语句,他现在持有一个写锁,但是在等待一个间隙锁的意向锁
    到这里大致猜测一下,可能是上面的delete语句会持有间隙锁,导致和insert语句的冲突,我们先看下这个语句持有锁的情况
begin;
delete from lock_table where xid = '172.16..:8091:440483815345885184' and branch_id in (440483816079888385,440483816235077633,440483816327356417,440483816373497857,440483816398655489,440483816746790913,440483817065558017);
SELECT * from `performance_schema`.data_locks;

在这里插入图片描述

这里有个关键点,supremum pseudo-record,这一行的意思就是对主键索引的最大索引值加锁,所以后续的insert都要等待这个锁,这里就产生竞争条件了,在并发的情况下就会出现死锁

解决

  1. 修改隔离级别为RC,不再添加间隙锁
  2. 升级seata版本,seata社区已经复现了这个bug,把数据库的链接修改为RC隔离级别了, 参照
https://github.com/seata/seata/pull/5638
``

http://www.niftyadmin.cn/n/5123914.html

相关文章

哈弗猛龙:让越野更加简单一点

10 月 10 日,哈弗猛龙正式上市,新车共推出了三款车型,售价区间在 16.58-18.38 万。 权益方面,购车可享首任车主 5 年免费基础保养、订金 2000 元抵 6000 元购车款、基础服务、智控服务终身免费,娱乐流量 3 年免费 (3GB…

广播和组播(多播)

广播 概述 广播(broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”。并非所有的计算机网络都支持广播&#xf…

Python开发利器KeymouseGo,开源的就是香

1、介绍 在日常工作中,经常会遇到一些重复性的工作,不管是点击某个按钮、写文字,打印,还是复制粘贴拷贝资料之类的,需要进行大量的重复操作。按键精灵大家想必都听说过,传统的方式,可以下载个按…

大数据-Storm流式框架(四)---storm容错机制

1、集群节点宕机 Nimbus服务器 硬件 单点故障?可以搭建HA jStorm搭建 nimbus的HA nimbus的信息存储到zookeeper中,只要下游没问题(进程退出)nimbus退出就不会有问题, 如果在nimbus宕机,也不能提交…

openEuler 22.03 LTS编译安装libreoffice并制作rpm包——筑梦之路

环境说明 操作系统:华为欧拉操作系统openEuler 22.03 lts x86_64 libreoffice版本:当前最新版本7.6 编译安装过程 1. 安装编译工具和依赖包 sudo yum install -y snappy snappy-devel autoconf automake libtool git gcc gcc-c gcc-objc make cmake…

带您走近Hyperscript:重新思考JavaScript

我们当中一些人也许还记得HyperCard,这是编程语言进化体系中一个有趣的分支。如果您上了一定的年龄,甚至还可能用HyperCard学过编程。Hyperscript是一种比较新的技术,它具有HyperCard的一些优点,特别是它的简洁性和类似英语的语法…

SAAS智能打印设计->自定义打印模板

1 业务场景 企业在业务运转过程中经常需要在线打印凭证、采购单、出入库单据等等。这时,你可以使用SAAS版打印设计器,根据自身需求自行设计打印模板,无论是打印纸张规格、打印方向,还是打印样式,你都可以自由调整设计…

Shopee、Lazada卖家不得不看的提升销量技巧,自养号测评打造权重

近年来,大部分虾皮、Lazada卖家开始通过测评补单的方式来提升店铺权重和产品排名,以吸引更多流量。这种方式可以有效提高产品的销售转化率,对店铺的运营起到推动作用。然而,测评补单并非简单的购买过程,其中涉及到许多…