刚刚接到一个上家公司同事的一个电话,问我为什么service方法事务不会滚了,日志打印了,调用webservice报错。

我让他把这个调用执行webservice的方法截图发给我,如下:
 
public Object[] send(String operationName,Object[] params,String endPoint) throws Exception {
Object[] results = null;
Client client = null;
try {
// 获取外部服务注册信息
Map<String, ExtWebserviceInfo> extMap = (Map<String, ExtWebserviceInfo>)SimpleCacheUtils.get(ExtWebService.WEBSERVICE);
// 获取操作名称
if (!ToolUtil.isNullOrEmpty(extMap)) {
// 获取服务方法名
String methodName = extMap.get(operationName).getServiceValue();
LOGGER.info("获取到方法标识为*"+operationName+"的操作名"+methodName);
// 创建client
client = new Client(new URL(endPoint));
LOGGER.info("监测到请求"+endPoint+"服务"+methodName+"操作方法的动作...");
// 执行调用
results = client.invoke(methodName, params);
LOGGER.info("向"+endPoint+"服务"+methodName+"操作方法发出的请求成功...");
}
} catch (Exception e) {
LOGGER.info("向"+endPoint+"服务标识为"+operationName+"的操作方法发出的请求出现异常..."+e.getLocalizedMessage());
throw(Exception)new Exception().initCause(e);
} finally{
if(client != null){
client.close();
}
}
return results;
}

  

 
这个方法是一个调用执行webservice的方法,并返回执行结果给调用者,就是上面这个方法报错。我一看到这个代码,中有try catch,我想一定是这个方法中把异常给拦截了,service中捕获不到异常,导致aop拦截不到异常信息,导致事务不回滚。
但是仔细一看发现这个方法虽然捕获了异常,但是捕获后有重新抛出异常。
 
} catch (Exception e) {
LOGGER.info("向"+endPoint+"服务标识为"+operationName+"的操作方法发出的请求出现异常..."+e.getLocalizedMessage());
throw(Exception)new Exception().initCause(e);
} finally{

  

这不是又抛出异常了吗?应该没有问题了啊。
仔细分一下,就发现问题就出在这里,它抛出的是一个Exception,而spring在事务回滚时,是只对runtimeException或者其子类的异常才会回滚。
而且这里抛出的是一个Exception,别人调用的时候肯定提示要trycatch,如果一不小心,catch中没有重新抛出runtimeException,那就会出现事务不回滚的问题,而且此问题一般不易被发现。
 
总结一下:
1、spring做aop事务拦截的一般都会配置在service层;
2、service层一般情况下不能trycatch,有时候有检查行异常,那么就往上抛,如果又不想抛,那么就trycatch中在throw new RuntimeException("出错了!!!");
3、service层抛出的异常必须是runtimeException或者其子类的异常。
 

spring事务回滚问题的更多相关文章

  1. Spring事务回滚和异常类

    1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和Exception继承Throwable.Error和RuntimeException及其子类成为未检查异常( ...

  2. 事务之二:spring事务(事务管理方式,事务5隔离级别,7个事务传播行为,spring事务回滚条件)

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

  3. Spring 事务回滚机制详解

    1:事务原理 1.2:aop/动态代理 类路径:org/springframework/aop/framework/CglibAopProxy.java ReflectiveMethodInvocat ...

  4. @Transactional spring事务回滚相关

    还可以设置回滚点,看下面 /** * 用户登录接口 * * * 1明确事务方法前的命名规则 * 2保证事务方法执行的时间尽可能的短,不允许出现循环操作,不允许出现RPC等网络请求操作 * 3不允许所有 ...

  5. spring 事务回滚

    1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: public method() { Dao1.save(Person1); Dao1.save( ...

  6. 关于Spring事务回滚的问题

    在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例比如配置文件里有这么 ...

  7. spring事务回滚无法捕捉

    这篇文章讲解了怎么配置才能让spring事务捕捉异常 http://www.360doc.com/content/12/1109/18/6161903_246870991.shtml 需要正确配置sp ...

  8. Spring事务回滚

    配置事物: @Configuration /**强制使用cglib代理时就把proxy-target-class设为true.*/ @EnableTransactionManagement(proxy ...

  9. Spring 事务回滚代码

    在事务中实行的方法:org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransacti ...

随机推荐

  1. 3.Linux的远程管理及网络下载

    3.1 Linux的远程管理 3.1.1 远程管理概述 什么是远程管理: 1.为什么需要远程管理: 服务器通常是Linux系统,而服务器不可能一直在身边,所以就需要远程来操作服务器 企业中通常需要集群 ...

  2. 洛谷——P3906 Geodetic集合

    P3906 Geodetic集合 题目描述 图G是一个无向连通图,没有自环,并且两点之间至多只有一条边.我们定义顶点v,u最短路径就是从v到u经过边最少的路径.所有包含在v-u的最短路径上的顶点被称为 ...

  3. UID中RUID、EUID和SUID的区别

    看UNIX相关的书时经常能遇到这几个概念,但一直没有好好去理清这几个概念,以致对这几个概念一直一知半解.今天好好区分了一下这几个概念并总结如下.说白了这几个UID引出都是为了系统的权限管理. 下面分别 ...

  4. 匈牙利算法求最大匹配(HDU-4185 Oil Skimming)

    如下图:要求最多可以凑成多少对对象 大佬博客: https://blog.csdn.net/cillyb/article/details/55511666 https://blog.csdn.net/ ...

  5. camera placement (paraview)

    # 'renderView1' is the view name# current camera placement for renderView1 renderView1.CameraPositio ...

  6. BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ...

  7. 用Twebbrowser做可控编辑器与MSHTML(调用js)

    记得intraweb的网页设计也程序开发分开中,是怎么定义的变量的.就是在网页中插入占位符.我们规定占位符是{%Name%} {%Birthday%}单页面装载之前or之后,我们用自己的js查找占位符 ...

  8. Maven学习总结(27)——Maven自定义打包插件maven-assembly-plugin详解

    Assembly插件会生成 "assemblies", 此特性等同于的Maven 1 distribution plug-in..该插件不仅支持创建二进制归档文件,也支持创建源码归 ...

  9. ansible plugins 列表

    [action plugins] [cache plugins]jsonfilememcachedmemorymongodbpickleredisyaml [callback plugins]acti ...

  10. 一个最简单的SPRINGMVC示例

    持久层,服务层,表现层都涉及到了. 这个分得确实比DJANGO细致, 多体会,多注解..:) The domain layer package com.packt.webstore.domain; i ...