记录工作遇到的死锁问题(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 ...
随机推荐
- springboot pagehelper分页无效
springboot pagehelper分页无效 遇到的问题把所有的数据都查出来了 -然后跟踪代码发现PageHelper.startPage没有生效,生成的sql也没有分页的信息 依赖也引入了 & ...
- java编写基于netty的RPC框架
一 简单概念 RPC:(Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO:当阻塞I/O ...
- python小例子(二)
1.在函数里面修改全局变量的值 2.合并两个字典.删除字典中的值 3.python2和python3 range(1000)的区别 python2返回列表,python3返回迭代器 4.什么样的语言可 ...
- windows系统先安装hexo
一.安装node.js 下载地址为:https://nodejs.org/en/可以根据自己需要下载对于的版本. 打开cmd,输入指令 node -v 若出现上图这样的结果则说明安装好了. 二.安装h ...
- Dubbo 优雅停机演进之路
一.前言 在 『ShutdownHook- Java 优雅停机解决方案』 一文中我们聊到了 Java 实现优雅停机原理.接下来我们就跟根据上面知识点,深入 Dubbo 内部,去了解一下 Dubbo 如 ...
- 2018.8.20 Python之路---常用模块
一.re模块 查找: re.findall(‘正则表达式’,‘字符串’) 匹配所有符合正则表达式的内容,形成一个列表,每一项都是列表中的一个元素. ret = re.findall('\d+','sj ...
- idea 2019 1 spring boot 启动报错 An incompatible version [1.2.12] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]
1.构建一个简单springboot工程,日志打印报错内容如下: 15:38:28.673 [main] DEBUG org.springframework.boot.devtools.setting ...
- 转:nginx和php-fpm的两种通信方式
原文地址:https://segmentfault.com/q/1010000004854045 Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP,一种是UNIX Domain Sock ...
- Go服务监控
使用Golang可以开发出高性能的HTTP.GRPC服务.一般项目运行后,我们也需要监控服务的性能或者进行调试.除了打日志,还有没有其他可视化的方案呢?答案是有的. 本文将会介绍几种常用的监控方案. ...
- 「刷题」JZPKIL
这道反演题,真牛逼. 以下用$B$代表伯努利数,$l*g=f$代表狄利克雷卷积,先推式子. 对于给出的$n,x,y$求一百组数据的$ans$ $\begin{array}{rcl} ans & ...