热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【一天一坑系列】手动提交事务,开启后未关闭导致的bug!啊,多么痛的领悟...MySQLTransactionRollbackException:Lockwaittimeoutexceeded

热门系列:程序人生,精彩抢先看1、前言前几天,春节过完开工第一天,结果运营就反应生产环境有BUG了。真是“开门红”啊~~~

热门系列:



1、前言

前几天,春节过完开工第一天,结果运营就反应生产环境有BUG了。真是“开门红”啊~~~

先和运营了解到线上的问题症状,然后就连接生产服务器,开始逐步排查了!



2、正文

2.1 生产环境的问题症状

症状一:查询列表的数据,有的数据会时有时无!(如ABCD四条数据,刷新页面,B数据时而出现,时而没有)

症状二:新建订单,创建成功后,数据并没有入库

前面两点是通过web端页面操作,所反映出来的异常情况!后续我们通过查看日志,还发现了另外两种日志异常!!!

症状三:程序接口会报数据库事务锁定异常,如下:

### 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

症状四:数据库无法连接异常,如下:

Caused by: java.sql.SQLException: connection disabled

 

2.2 分析

①对于症状一,查询数据时有时无的情况,分析:

  • 用了缓存,缓存失效导致
  • 列表结果不一致的,是因为请求到了两个不同的服务上(即分别请求到不同的两个进程了)

②症状二分析:

  • 提交请求,发送到了其他服务上
  • 数据库配置问题,导致数据插入到了别的数据库

③症状三分析:

  • 数据库锁表,导致事务阻塞,被锁
  • 数据库事务的传递性没有正确配置
  • 事务未正确开启和关闭导致事务阻塞

④症状四分析:

  • 数据库配置出了问题,导致数据库不可连接
  • 服务器与数据库之间的连接有问题

 

2.3 解决

本篇主要是针对症状三,进行分析解决!所以其他的问题,此处暂且不做解决方案叙述了~(目前问题都已经解决了,如有兴趣的朋友,可以下方留言探讨)!

上面已经对问题进行了几个方面的分析,所以按分析的方向,开始逐一排查!

①首先,查询数据库,查看是否有被锁表的情况:

-- 查看正在被锁定的的表show OPEN TABLES where In_use > 0;in_use:多少个线程在使用name_locked:是否被锁-- 查询哪些线程正在运行show processlist;-- 最关键的就是state列-- 查看正在锁的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;-- 查看等待锁的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

通过上面的查询之后,发现数据表并没有被锁死的情况。所以锁表导致的事务异常,可以排除!

②排查程序中数据库事务传递性的配置,但是我们使用的是默认配置,即:

//支持当前事务,如果当前没有事务,就新建一个事务。
PROPAGATION_REQUIRED

所以,事务传递性导致的可能性,也基本可以排除了!

③事务是否没有被正确的开启和关闭呢?答案是肯定的!!

后来,从代码层面排查事务的使用情况,结果发下如下代码:

try{TransactionStatus status = super.openTransaction("createStockEntrustOrder", TransactionDefinition.PROPAGATION_REQUIRED);boolean validResult = stockEntrustList.stream().anyMatch(s-> !this.checkOrderParam(s));if(validResult) return new CommonResultVO(ResultConstant.PARAM_ERROR);............transactionManager.commit(status);
}catch (Exception e) {......transactionManager.rollback(status);return new CommonResultVO(ResultConstant.FAIL);
}

问题来了:此处有一个校验返回的处理,就在开启事务之后!那么此时就可能出现,校验没通过,接口中的事务开启了,但是因为直接return,导致事务没有被正确关闭掉!!!如果类似情况,出现多次,就很有可能造成事务的阻塞,锁定异常的情况的发生!

解决方式:将此处的代码进行调整,在return的地方进行事务的回滚操作!!!或是,使用注解事务

@Transactional(rollbackFor = Exception.class)

最终,此症状得以修复!!!

 



3、总结

通过此次问题的暴露,个人总结两点原因:

  • 写代码的时候,不够仔细,代码逻辑处理不够严谨
  • 代码编写完成或是测试前,没有进行自我Review,查缺补漏

所以,记录此篇文章,引以为戒,往后Coding时,需更加的谨慎,并要有良好的代码review习惯,减少bug的出现!!!

如果此篇文章有帮助到你,或是有不足的地方,欢迎留言探讨,共勉~~~~

在这里插入图片描述


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务
    java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务第三步java实现 ... [详细]
  • 开发笔记:(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
w3shuajiang2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有