1.事故背景

原本在使用的是注解式事务,后面因为需要在事务中增加异步推送机制,所以需要将推送机制放到事务之外,修改后发现系统经常出现事务长时间无法提交导致回滚。

2.排查流程

(1)一开始重启应用是能恢复正常,所以肯定是在某种情况下会触发异常的产生

(2)查看在mysql控制台查看当前正在执行的事务(SELECT * FROM information_schema.INNODB_TRX),分析该sql语句在逻辑上并没有锁竞争的出现,只是单单一条update语句,但事务却没有提交

(3)这时候确定在业务代码逻辑上不会出现锁竞争,但事务却没有正常提交,所以考虑是mysql连接会话的autoCommit属性为false导致事务无法正常提交

(4)因异常出现是在讲注解式事务改为编程式事务之后,所以猜测是因为该改动导致异常出现

3.原理分析

(1)spring事务支持原理:spring的事务支持原理是先将mysql连接会话的自动提交属性关闭,即将当前会话的autoCommit属性设置为false,然后将该连接绑定到该线程中,在该事务中的所有数据库操作都是使用同一个线程,所有的数据库操作完成后才主动去做commit操作完成事务

(2)以下为编程式事务出现异常的流程分析的代码示例

当开启事务时,当前会话的自动提交属性讲被设置为false

当事务没有提交而是提前return出去时,会话的状态并不会改变,autoCommit属性一直为false,这就导致当其他请求使用该数据库连接会话操作数据库时,事务将无法自动提交,如下图所示,即使没有开启事务,

autoCommit状态也是为false,所以会导致其他使用该会话的事务无法正常提交

4.改进方式

(1)避免在未主动commit事务前return出去

(2)增加finally代码块,判断事务状态,回滚事务即可

  1. DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
  2. TransactionStatus transactionStatus = transactionManager.getTransaction(defaultTransactionDefinition);
  3. try {
  4. doSomething();
  5. } catch (Exception e) {
  6. transactionManager.rollback(transactionStatus);
  7. getLogger().error(e.getMessage());
  8. throw new RuntimeException("系统异常");
  9. } finally {
  10. if(null != transactionStatus && !transactionStatus.isCompleted()){
  11. transactionManager.rollback(transactionStatus);
  12. }
  13. }
  1.  

Spring编程式注解使用不当导致其他事务无法正常提交的更多相关文章

  1. Spring编程式事务管理

    --------------------siwuxie095                                 Spring 编程式事务管理         以转账为例         ...

  2. Spring编程式事务管理及声明式事务管理

    本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...

  3. Spring编程式和声明式事务实例讲解

    Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 历史回顾: 可能是最漂亮的Spring事务管理详解 Spring事务管理 S ...

  4. spring 编程式事务管理和声明式事务管理

    编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...

  5. Spring编程式事务管理和声明式事务管理

    本来想写一篇随笔记一下呢,结果发现一篇文章写的很好了,已经没有再重复写的必要了. https://www.ibm.com/developerworks/cn/education/opensource/ ...

  6. 阶段3 2.Spring_10.Spring中事务控制_9 spring编程式事务控制1-了解

    编程式的事物控制,使用的情况非常少,主要作为了解 新建项目 首先导入包坐标 复制代码 这里默认值配置了Service.dao和连接池其他的内容都没有配置 也就说现在是没有事物支持的.运行测试文件 有错 ...

  7. Spring笔记04_AOP注解开发_模板_事务

    目录 1. Spring基于AspectJ的注解的AOP开发 1. 1 SpringAOP的注解入门 1.2 Spring的AOP的注解通知类型 1.2.1 @Before:前置通知 1.2.2 @A ...

  8. spring编程式刷新/重新加载applicationcontext/dispatchservlet(正确版)

    有些时候,尤其是在开发应用框架的时候,由于某些原因无法或者很难重启tomcat或者reload应用,但是配置又需要动态生效,这个时候通常希望通过reload spring applicationcon ...

  9. Spring学习8-Spring事务管理(编程式事务管理)

    一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...

随机推荐

  1. PHP filetype() 函数

    定义和用法 filetype() 函数返回指定文件或目录的类型. 如果成功,该函数返回 7 种可能的值之一.如果失败,则返回 FALSE. 可能的返回值: fifo char dir block li ...

  2. zabbix配置钉钉机器人告警

    目录 zabbix配置钉钉机器人告警 1. 在钉钉中创建群聊,在群里面添加自定义机器人 2. 配置钉钉告警脚本 3. 配置脚本告警 3.1 创建媒介 3.2 为用户添加对应媒介 3.3 创建动作 4. ...

  3. Python编程初学者指南PDF高清电子书免费下载|百度云盘

    百度云盘:Python编程初学者指南PDF高清电子书免费下载 提取码:bftd 内容简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python可以用于很多的领域,从科学计算 ...

  4. 【FZYZOJ】下片 题解(最短路+超级源点)

    题目描述 为了提高服务器的耐受能力,很多流量大的网站都会架设多台服务器,而互联网的路由能找到线路最短的一台服务器. 现在UOI想要下片,他有好多台电脑,又有好多服务器可以提供下载.UOI将给你一个网络 ...

  5. 31-关键字:final

    final:最终的 1.可以用来修饰:类.方法.变量 2.具体的: 2.1 final 用来修饰一个类:此类不能被其他类所继承. * 比如:String类.System类.StringBuffer类 ...

  6. windows下Nginx+RTMP部署

    在windows下部署参考博客:https://blog.csdn.net/l1028386804/article/details/80022437 参考这个部署完成后,一般没有什么问题,可以看到视频 ...

  7. 云服务器远程连接mysql数据库

    首先需要在云服务器上,下载安装好mysql与Navicat. mysql下载好以后,打开云端的开始,找到mysql的命令窗,进入输入自己的mysql密码,稍等片刻进入mysql数据库 进入之后输入下列 ...

  8. Java语言程序设计2019.9.16

    1.Java的基本运行单位是类. 2.类是由方法和变量组成. 3.变量类型分为byte,int,double,long,short,boolean,char,float.java中整数类型默认的int ...

  9. 干!一张图整理了 Python 所有内置异常

    在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...

  10. python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...