工作中遇到的数据库死锁问题 - 排查方案 CannotAcquireLockException

2023-11-03

问题·重现

正常情况下,销售人员在使用我们的销售系统为客户创建订单时候,后台java代码就会开启事务,然后往数据库中添加订单信息和订单详情信息,以及一些其他业务操作。但由于某次异常操作(可能是网络或者其他的原因),导出系统出现问题无法工作。

于是进行代码调试,发现在向数据库中插入数据的时候,一直卡在添加数据这个方法上,等待了很长一段时间,一直无法响应。在经过一段时间后,通过try…catch…捕获了 org.springframework.dao.CannotAcquireLockException异常,如图。

后台代码展示,就是在orderGoodsService.addOrderGoods这方法一直卡住。
在这里插入图片描述
后台打印处理的错误日志如下:

### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
### The error may exist in file [D:\Idea workspace\bussiness\target\classes\mapper\order\OrderGoodsMapper.xml]
### The error may involve com.dwnest.business.dao.order.OrderGoodsMapper.insert-Inline
### The error occurred while setting parameters
### SQL: insert into order_goods (id, goods_id, consumer_id,       coupon_id, discount_scale,       product_name, sku_id, specification, sku_pic_url, item_number,       main_material, auxiliary_material, out_length,        out_wide, out_high, cycle_date1,        cycle_date2, nums, sale_price,        discount_price, total_price, status,        `explain`, store_id, create_time,       create_by, update_time, update_by,change_subtract       )     values (?, ?, ?,       ?, ?,       ?, ?, ?,       ?, ?, ?, ?,       ?,       ?, ?, ?,        ?, ?, ?,        ?, ?, ?,        ?, ?, ?,        ?, ?, ?,?       )
### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

然后后台报出异常,前台提示订单创建失败:
在这里插入图片描述

问题·分析

虽然后台在try…catch的时候报出了org.springframework.dao.CannotAcquireLockException异常,但是在打印出日志的时候,显示的是com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction。提示的是Lock wait timeout exceeded(锁等待超时);try restarting transaction (尝试开启新事务);

就是说,在我们开启事务插入数据的时候一直未获取到锁,等待超时了。所有现在的问题就是查看为什么无法获取到锁。

问题·排除

这里可以确定问题是出现于数据库中,要从数据库中进行排查。

由于当前请求获取不到锁,可以能有以下情况:

  1. 数据库是否发生表锁,整张表被锁定,也就无法往里插入数据了。通过以下命令查询是否表锁,然后得到的结果为空,表示没有发生表锁,这个情况排除;
show open table where in_use > 0; //查询是否表锁
  1. 数据库中该表是否有事务抢占了该锁,导致该请求无法获取锁,然后一直等待,等待时间超过数据库设置的默认时间就会失败。通过以下命令查询是否有事务被锁住,果然,查到了有一条记录,从2020-05-09 15:03开始的,状态时(RUNNING)运行,线程id为428847。
select * from information_schema.innodb_trx // 查询运行的事务,是否被锁住

在这里插入图片描述
虽然查询出一条记录,但是无法确定是否时该条数据导致的,于是再次发生插入订单数据请求,在orderGoodsService.addOrderGoods这个方法卡住的时候,查看数据库的select * from information_schema.innodb_trx这条命令,得到两条结果。第一条结果是刚添加的,状态时Lock WAIT锁等待,接下来的情况就是一直无法获取锁,最后会执行失败。原因就是第二条结果是导致的。所以可以确定就是线程id为428847,这个结果导致的。

在这里插入图片描述
好家伙,从下午3点,一直卡到5点,还在运行,一直持有锁不放,导致当前插入数据失败。

问题·解决

由于之前的某种原因,导致事务一直卡住,所以只需要把之前的事务杀死就可以了,

kill id; // id为线程id,使用该命令就可以杀死某条线程

然后查看数据库的select * from information_schema.innodb_trx就会发现结果为空,在调用插入订单的时候,就成功了。这个问题就解决了。

其他命令

select * from information_schema.innodb_locks // 查看当前锁定的事务
select * from information_schema.innodb_locks_waits //查看当前等待锁的事务

记录一下开发中存在的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

工作中遇到的数据库死锁问题 - 排查方案 CannotAcquireLockException 的相关文章

  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • Flask-login:无法理解它是如何工作的

    我试图理解如何Flask Login https flask login readthedocs org en latest works 我在他们的文档中看到他们使用预先填充的用户列表 我想使用数据库存储的用户列表 但是 我不明白其中的一些
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 仅当值发生更改时如何插入数据库?

    我需要更新 替换 MySQL 数据库中的字段 但前提是它们已更改 该表包含 ID 文本字段和更改日期 用户根据更改日期通过 ID 查询数据 即 如果该日期早于用户上次查询数据的时间 则他不想要它 仅当文本字段与具有相同 ID 的现有文本字段
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • 从另一台计算机访问 MYSQL

    我想开发一个java桌面应用程序 我想在其中设置服务器 这意味着我在这里使用mysql db 该数据库将仅存储在一台电脑上 其余所有用户都可以访问该数据库 所以 我听说了mysql远程连接 其中尝试了一些事情 这些措施如下 我的电脑已连接w
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • Google Cloud SQL 在重新启动时卡住

    我的云 sql 实例长时间处于重新启动状态 在操作窗格中 重新启动的状态显示为待处理 并且还发生了导出 其状态仍为Running 有没有办法可以强制重新启动或取消重新启动或从常规备份中恢复数据 不 没有办法 如果您向 Google 支付高级
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5

随机推荐

  • Vijava 学习笔记之(Template 克隆虚拟机并修改Template 指定虚拟磁盘大小)

    源代码 package com vmware template import com vmware util Session import com vmware vim25 import com vmware vim25 mo import
  • 通过百度地图API和高德地图API进行反坐标逆向地理位置

    本文分别通过百度地图API和高德地图API 通过WGS84的坐标返回详细的地理位置 一 通过百度地图API进行反坐标逆向地理位置 import java io BufferedReader import java io IOExceptio
  • 英语CET6救命作文通用模板

    这是根据刘晓燕的6级救命班所写的笔记 建议结合 英语四六级万能作文模板 进行独一无二的英语作文模板创造 一 常见土单词排行榜 think 可替换为 have been convinced that be of the opinion tha
  • hive三种元数据存储方式

    hive本身不存储数据 借助hdfs存储数据 hive和关系型数据库一样是有表结构的 这些信息hive也存储在第三方软件中 如derby mysql 根据元数据的存储方式 hive的部署可以分为三种 一 local模式 采用内置的derby
  • Eladmin框架前端后台学习笔记

    文章目录 Eladmin框架前端后台学习 项目简介 用户账号密码 运行 技术栈 项目结构 常见问题 1 如何开发一个新模块 2 如何做权限管理 3 头部增删改查等按钮 不显示某个按钮 或从左侧或右侧新增按钮 4 页面初始化时不请求查询数据接
  • Golang 单元测试框架的使用

    一 使用gomonkey stub 打桩 在测试包中创建一个模拟方法 用于替换生成代码中的方法 1 stub函数 gomonkey ApplyFunc target double 其中target是被mock的目标函数 double是用户重
  • 文件上传骚姿势合集

    目录 黑名单规则绕过 绕过前端 js 检测方法 判断是否为前端检测还是后端服务器检测方法 绕过 contnet type 检测上传 常见MIME类型 绕过黑名单上传 同解析后缀名 htaccess 重写解析绕过上传 大小写绕过上传 空格绕过
  • http、https流程以及版本区别

    从输入url后按下回车开始 因为可能记录了地址 看是否要redirect 因为可能记录了永久跳转成新的地址 再看缓存 没有缓存再去服务器 首先查找DNS 创建TCP连接 发送http请求数据包 返回响应数据 结束接受返回 http 0 9
  • Spark 流数据处理简介

    一 Spark 基础知识 1 1 Spark 简介 Spark是专为大规模数据处理而设计的快速通用的计算引擎 可用它来完成各种各样的运算 包括 SQL 查询 文本处理 机器学习等 1 2 核心概念介绍 Spark常用术语介绍 Applica
  • HTTP报头

    HTTP协议是什么 HTTP协议 HyperText Transfer Protocol 超文本传输协议 是用于从WWW服务器传输超文本到本地浏览器的传送协议 它可以使浏览器更加高效 使网络传输减少 它不仅保证计算机正确快速地传输超文本文档
  • 一篇文章入门Hibernate框架

    什么是Hibernate 一个框架 一个Java领域的持久化框架 一个ORM框架 什么叫持久化操作 和数据库相关的各种操作 对象的增删改查 什么是ORM 对象 关系映射 ORM思想 将关系数据块中表中的记录映射成为对象 以对象的形式展现 程
  • 525中电六所智能

    还是要记录一下 总结反思学习一下的 0 面试官自我介绍 1 自我介绍 2 介绍项目 有了解过视频流嘛 视频流是指视频数据的传输 例如 它能够被作为一个稳定的和连续的流通过网络处理 因为流动 客户机浏览器或插件能够在整个文件被传输完成前显示多
  • 数据库系统概论 中文高清PDF版下载

    数据库系统概论 中文高清PDF版下载 转载于 https www cnblogs com gavinhughhu archive 2010 01 05 1639949 html
  • 等保测评2.0_三级——【安全计算环境】MySQL数据库测评项汇总

    等保测评2 0 三级 安全计算环境 MySQL数据库测评项汇总 安全计算环境 MySQL数据库测评项汇总 五个测评单元 控制项 1 身份鉴别 a 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 b
  • Ngnix:防止恶意域名解析

    通过nginx部署的网站 默认没有设置主机头 可以通过IP或其他未在配置文件中指定的域名来访问 这有可能会导致恶意域名指向到我们服务器IP地址 而根据工信部备案系统判定原则 如有非法域名恶意指向用户主机并且网站访问状态为未有效关闭 则此类非
  • ubuntu 下安装Valgrind 内存泄漏检查工具

    Valgrind 安装 1 到www valgrind org下载最新版valgrind 3 7 0 tar bz2 2 解压安装包 tar jxvf valgrind 3 7 0 tar bz2 3 解压后生成目录valgrind 3 7
  • 【超快捷】Windows系统自带的快捷键合集

    总览 一 常用 Win E 打开我的电脑 Win R 打开 运行 对话框 Win L 锁定计算机 Ctrl Shift Esc 打开任务管理器 Ctrl Alt Delete 打开安全窗口 F2 重命名文件 F5 刷新当前页面或者桌面 Al
  • ERP让员工和企业双赢

    企业的科学管理 离不开数字化 而数字化 就需要企业积累数据 这就离不开ERP ERP实施 如果只是员工增加了数据录入量 而没有获得实际的益处 比如 效率提高 难度降低等 则员工内心会抵制ERP 员工要的是方便 企业要的是数据 必须兼顾二者
  • 快速理解聚集索引和非聚集索引

    数据库的索引 听起来挺神秘的 仔细想想 这些索引 其实就是平时咱们查东西时候常用的两种手段 无非就是为了提高我们找东西的效率而已 那么我们平时又是怎么查东西呢 聚集索引 聚集索引 来源于生活尝试 这中索引可以说是按照数据的物理存储进行划分的
  • 工作中遇到的数据库死锁问题 - 排查方案 CannotAcquireLockException

    问题 重现 正常情况下 销售人员在使用我们的销售系统为客户创建订单时候 后台java代码就会开启事务 然后往数据库中添加订单信息和订单详情信息 以及一些其他业务操作 但由于某次异常操作 可能是网络或者其他的原因 导出系统出现问题无法工作 于