一、 现象

用户打开消息推送有概率报错,后续发现推送消息阅读数、点赞数无法正常更新,mysql报警有行锁,

DBA抓到有锁表语句,kill该语句未正常恢复,elk日志有大量的java.sql.SQLException: connection holder is null 重启应用恢复

二、分析

根据elk日志,出现cause by Lock wait timeout exceeded 的异常,经检查代码发现,有部分代码手动开启事务begin,但是走入分支造成结果却未提交事务。

使得数据被锁长时间不能释放,(而系统当前也未做超时断开处理,导致异常情况发生时自愈能力不足)造成连锁反应,导致业务受到影响,最终引发系统崩溃。

三、解决方法

1.根据异常日志 connection holder is null,添加相关断开配置

druid
remove-abandoned:true
remove-abandoned-timeout:45000

注意:如果存在长事务可能存在链接强行被回收的情况。

2.spring框架管理事务

(1)基于注解

<!-- 添加事务管理器组件DataSourceTransactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 使用set方法注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 开启基于注解声明式事务 注意配置transaction-manager属性,它引用了我们事务管理组件对象,这里要和事务管理器组件id一致
默认是transactionManager -->
<tx:annotation-driven transaction-manager="transactionManager" />

(2)基于xml

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 装配数据源 -->
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>
<!--使用xml配置事务方法 -->
<aop:config>
<!-- 设置添加事务的方法,使用切入点表达式-->
<aop:pointcut expression="execution(* *.checkout(..))" id="mypoint"/>
<!-- 将事务方法和事务的相关配置关联起来 -->
<aop:advisor advice-ref="myAdvice" pointcut-ref="mypoint" />
</aop:config>
<!-- tx配置事务的属性 (使用tx名称空间)-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 配置事务的属性,多个事务方法也可以在这个里面放,name设置事务方法名,propagation设置事务相关信息 -->
<tx:method name="checkout" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

注意未被托管到的事务处理

最新文章

  1. Dev Cpp 输出中文字符问题
  2. $.extend()的深拷贝和浅拷贝详细讲解
  3. 彻底掌握this,call,apply
  4. c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)
  5. Control character in cookie value, consider BASE64 encoding your value
  6. 剑指Offer42 左旋字符串
  7. 【转】最短路&amp;差分约束题集
  8. json解析日期方法 问题的解决方案
  9. PHP学习之-1.7 注释
  10. #2006 - MySQL server has gone away 问题解决方法 (全) (转)
  11. dom元素循环绑定事件的技巧
  12. beforeunload
  13. [leetcode-592-Fraction Addition and Subtraction]
  14. IoC是什么
  15. Java基础--Java---IO流------GUI(布局)、Frame、事件监听机制、窗体事件、Action事件、鼠标事件、对话框Dialog、键盘事件、菜单
  16. 菜鸟学IT之python网页爬取多页爬取
  17. 重学JavaScript - 数组
  18. python爬虫之静态网页——全国空气质量指数(AQI)爬取
  19. List GroupBy真实用法,Reflection(反射)用法,Enum用法,正则,搜索下拉布局
  20. step_by_step_用python爬点磁力链接

热门文章

  1. 特斯拉Toolbox诊断检测仪工具Tesla诊断电脑 Tesla Toolbox
  2. 下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。
  3. Linux kernel 同步机制
  4. Redis集群数据没法拆分时的搭建策略
  5. how2j 仿天猫j2EE零散笔记
  6. Maven 私服(Nexus)
  7. 根据pom标签修改
  8. 通过模拟数据,使用js在前端实现模糊查询下拉框功能实例教程
  9. SDNUOJ1016矩形合并
  10. Hive 中日志的存放位置