Deadlock found when trying to get lock; try restarting transaction

news/2024/11/30 10:28:25/

报错详情

Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

The error may involve com.iss.cms.fdrb.common.dao.entity.InterfaceQueue.updateInterfaceQueue-Inline

The error occurred while setting parameters

SQL: update t_fdrb_interface_queue t  set       t.send_status = ?,       t.update_time = ?       where tenant_id = ? and biz_code= ? and biz_id = ? and send_status in (1,3)

Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:267)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate

MySql锁类型的介绍

上面是MySql锁表的问题报错日志,今天记录一下解决方案。

  1. 行级锁在使用的时候并不是直接锁掉这行表记录,而是锁索引
  2. 如果一条Sql用到了主键索引的话,mysql会锁住这条记录主键索引
  3. 如果一条Sql用到了非主键索引,mysql会先锁住非主键索引,然后再锁定主键索引

原理

mysql的两情况的锁,排它锁与共享锁。

  1. 排它锁是事务T对数据A加上排他锁,只能允许事务T读取和修改数据A,别的事务没有办法进行读取与修改的操作处理,所以叫做排他锁,是互斥的
  2. 共享锁是事务T对数据A加上共享锁,其他事务只能再对数据A加上共享锁,而不能进行排它锁的操作,别的事务也可以加上共享锁。是不会进行互斥的

一般造成死锁的原因是因为两个事务添加了锁的时候没有及时进行释放锁资源,等到第二个事务要添加排他锁的时候,发现已经被锁了,从而导致的环路等待,构成死锁

问题的排查过程

日志定位可以找到具体的表是什么,然后定位这

从表里面可以发现进行更新的时候,没有用到索引,而是使用两个非索引,类似聚合索引的方式进行更新的处理。

问题的解决方案

针对这种情况,需要进行调整,先查询出来这一条记录,然后根据主键来进行更新的操作即可。

调整前的sql

update t_fdrb_interface_queue${tableNo} t  set

      t.send_status = #{sendStatus},

      t.update_time = #{updateTime}

   where tenant_id = #{tenantId} and biz_code= #{bizCode} and biz_id = #{bizId} and send_status in (1,3)

调整后的sql

第一步:查询

select

  t.biz_code as bizCode,

  t.biz_id as bizId,

  t.send_status as sendStatus,

  t.create_time as createTime,

  t.update_time as updateTime,

  t.send_num as sendNum,

  t.send_Lang as sendLang,

  t.id as id

from  t_fdrb_interface_queue${tableNo} t

where t.tenant_id = #{tenantId} and t.biz_code= #{bizCode} and biz_id = #{bizId} and send_status in (1,3)

第二步:更新

update t_fdrb_interface_queue${tableNo} t  set

        t.send_status = #{sendStatus},

        t.update_time = #{updateTime}

where  id= #{id}

这里备注一下,后续在操作更新的操作时,要使用索引进行更新,避免死锁的情况


http://www.ppmy.cn/news/847.html

相关文章

将整个网站变为黑白色

目录 效果: 代码: 兼容性写法: 原理: 效果: ps:实测淘宝也是用的这种方式,有兴趣可以去看看 代码: 使用方式就是找到根标签,将里面的两行代码放进去即可 html {filte…

单商户商城系统功能拆解41—应用中心—用户储值

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

Java后端接口幂等的方案

原文网址:Java后端接口幂等的方案_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java后端接口幂等的方案。 接口幂等也是Java后端面试中常见的问题。 幂等的含义 对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的…

Python中__init__.py的作用介绍

一、文件__init__.py作用:package / module 的标志 下图的serrors包含这个文件时候,Python会将其当做一个模块(module)来处理,进而可以使用from serrors import xx方式导入serrors包中的文件或模块。 如图所示&#x…

马斯克这波操作赢麻了?网友:这是我们玩剩下的

我愿称马斯克已经掌握了人民企业家的精髓——写周报。 周报这东西在国内大家并不陌生,深受荼毒的人更非少数。不过在国外倒是很少,如果确实要汇报,一般都是拉个电话会议,只能说马斯克确实学到了精髓。 不过比起国内的周报卷到飞…

前端面试题集锦(3)

目录 1、解释一下什么是闭包 ? 2、解释一下原型和原型链 ? 3、说一下 ES6 中你熟悉的一些内容 ? 4、数组排序的方式 ? 5、什么是事件轮询(EventLoop) ? 6、数组的一些API, 哪些能够改变原数组, 那些不能 ? 7、for 循环与 forEach 的区别 ? 8、url 的组成 ? 9、…

谁在抢夺千亿老酒

一个中老年男人,推着一辆三轮车,上面放着“高价回收老酒”的纸牌子——这就是老酒民间交易的一个缩影。 这个看似简陋的买卖背后,蕴藏着巨大的市场。 相关数据显示,我国老酒市场规模已破千亿。老酒收藏爱好者、专门的运营机构以…

Postman之Newman命令行运行脚本生成HTML报告

目录 一、Newman的下载安装 二、Newman生成Html报告 三、执行脚本准备 3.1.导出项目集脚本 3.2.导出环境变量 3.3.导出全局变量 3.4.data数据驱动文件 3.5.文件存储 四、Newman运行命令简介 4.1.运行命令:newman run 4.2.常用参数: 4.3.执行…