记录工作遇到的死锁问题(Lock wait timeout exceeded; try restarting transaction)
1.问题背景
刚来新公司不久,对业务还不太熟悉,所以领导先安排我维护原有系统。大概介绍下项目背景,项目分为核心业务部分在项目A中,与第三方交互的业务在项目B中,前端发起请求调用A项目接口,并在A项目中调用B项目接口,并在B项目中调用第三方获取数据(原有系统这样设计的)。
获取到第三方数据后判断数据库中是否有该记录(有唯一键),如有则执行更新操作,没有则新增。并且如果第三方认为该数据已失效,需要从数据库中删除(逻辑删除),并返回第三方删除成功回调,后续便不会再查到已失效的数据。
对应流程图如下

在代码处理中对整个过程加事务@Transactional注解,即在对数据进行删除(逻辑删除,实际执行update语句)时会根据唯一索引对该行加锁。在生成环境B项目频繁出现Lock wait timeout exceeded; try restarting transaction 异常,经排查定位到该功能代码,排查代码发现该功能有如下代码

有经验的同学应该已经看出问题所在,这里将全局异常捕获,记录错误日志,但问题就出在catch这里,由于异常被catch吞噬,@Transactional无法拿到异常,所以不会执行rollback回滚,导致一直占用数据库行锁。(这里的异常是调用第三方接口失败,由于调用太频繁,第三方接口崩溃,这里后续也做了并发控制) 所以后续事务在执行更新该行记录时由于得不到锁而等待失败,就报了Lock wait timeout exceeded; try restarting transaction 异常。
2.问题影响
由于该接口是在核心项目A中有客户端发起调用,并在A项目中调用B项目,由于B项目死锁无法返回结果,导致A项目前端大量请求阻塞,由于tomcat支持的请求线程数有限,该问题直接导致A服务宕机。影响较为严重。
3.如何解决
下面说下该问题解决思路,由于A项目宕机,在服务器日志中可以看到大量上述异常信息,Lock wait说明出现了锁问题。
a.使用 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;查看当前事务,使用SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;查看当前锁定的事务,使用SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;查看当前等锁的事务。使用以上三个sql基本能定位到代码所在位置。
b.定位到代码后,就要看具体的代码问题了,导致异常没有回滚的原因很多。这里说一个注意事项,使用@Transactional注解,默认只会对RuntimeException进行回滚,而对IOException和SQLException不会触发回滚。如果要对两个非运行时异常进行回滚,需要在@Transactional中加入@Transactional( rollbackForClassName = {"IOException","SQLException"})或对全局异常Exception做回滚,配置为@Transactional(rollbackFor = Exception.class)。又或者捕获IOException后手动抛出一个RuntimeException
总结
以上为博主在实际工作中遇到的问题,这里记录一下方便以后遇到类似问题可以快速定位并解决问题。也希望能对大家有帮助。
记录工作遇到的死锁问题(Lock wait timeout exceeded; try restarting transaction)的更多相关文章
- 【问题解决:死锁】Lock wait timeout exceeded; try restarting transaction的问题
执行数据删除操作时一直超时并弹出Lock wait timeout exceeded; try restarting transaction错误 解决办法 1.先查看数据库的事务隔离级别 select ...
- mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决
前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...
- 项目中遇到的死锁问题: Lock wait timeout exceeded; try restarting transaction
最近项目中频繁出现 Lock wait timeout exceeded; try restarting transaction这个错误,把我们弄得痛苦不堪啊,为了解决问题,上网上找好多资料,终于把 ...
- mysql Lock wait timeout exceeded; try restarting transaction解决
前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理: ...
- MySQL事务锁等待超时 Lock wait timeout exceeded; try restarting transaction
工作中处理定时任务分发消息时出现的问题,在查找并解决问题的时候,将相关的问题博客收集整理,在此记录下,以便之后再遇到相同的问题,方便查阅. 问题场景 问题出现的场景: 在消息队列处理消息时,同一事务内 ...
- MySQL应用报错:java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
开发反馈,某业务系统插入一条记录的时候,日志报错,插入失败: ### Error updating database. Cause: java.sql.SQLException: Lock wait ...
- pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')错误处理
问题描述: 在使用pymysql库时,利用游标执行插入操作,产生错误,会出现pymysql.err.InternalError: (1205, 'Lock wait timeout exceeded; ...
- 排查mysql innodb Lock wait timeout exceeded; try restarting transaction的问题
OMG写的时候崩溃了一次. 触发关注这个问题的事情是 我们在使用pt-online-schedule 改表的时候总是拿不到锁,并且报出mysql innodb Lock wait timeout ex ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
本文为博主原创: 以下为在程序运行过程中报的错误, org.springframework.dao.CannotAcquireLockException: ### Error updating dat ...
随机推荐
- Vulnhub靶场渗透练习(四) Acid
利用namp 先进行扫描获取ip nmap 192.168.18.* 获取ip 没发现80端口 主机存活 猜测可以是个2000以后的端口 nmap -p1-65533 192.168.18.14 ...
- java学习3-流程控制与数组
1.顺序结构 2.分支结构 3.循环结构 4.控制循环结构 break continue return 5.数组
- Web登录中的信心安全问题
1. 一个简单的HTML例子看看用户信息安全 标准的HTML语法中,支持在form表单中使用<input></input>标签来创建一个HTTP提交的属性,现代的WEB登录中, ...
- lnmp安装mysql
lnmp安装mysql 下载lnmp wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz 解压 tar ‐xf lnmp1..tar.gz 安装数据库 ./i ...
- V2er - Best client for V2EX
V2er - Best client for V2EX 可能是体验最好的掌上 V2EX 客户端,专为 iOS 打造并在 Github 开源. 关于 V2EX,V2EX 是创意工作者们的社区.这里目前汇 ...
- Asp.net Core全局异常监控和记录日志
前言 系统异常监控可以说是重中之重,系统不可能一直运行良好,开发和运维也不可能24小时盯着系统,系统抛异常后我们应当在第一时间收到异常信息.在Asp.net Core里我使用拦截器 ...
- 不离开Emacs完成简单程序的编辑编译运行(windows或Linux)
(1)打开Emacs (2)建立一个新的程序文件. 执行 C-x C-f, 然后在屏幕的底部出现minibuffer,光标提示你输入文件名称, 文件名称要带上后缀名,如hello.cpp.回车,然后开 ...
- vue-cli3没有config文件解决方案,在根目录加上vue.config.js文件
module.exports = { /** 区分打包环境与开发环境 * process.env.NODE_ENV==='production' (打包环境) * process.env.NODE_E ...
- SpringBoot 整合 Elasticsearch深度分页查询
es 查询共有4种查询类型 QUERY_AND_FETCH: 主节点将查询请求分发到所有的分片中,各个分片按照自己的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点,主节点对所有数据进行汇总 ...
- 获得shell的几种姿势
windows提权 1.通过sqlmap连接mysql获取shell (1)直接连接数据库 sqlmap.py -d "mysql://root:123456@127.0.0.1:3306/ ...