spring 事物中遇到try catch 事物不会滚

依赖spring事物时,当service层进行try catch异常捕获时,事物不会产生回滚,

service层代码如下@Resource

    TestDao testDao;
    public void insertMsg(ConversationBean conversationBean){
        try{
            for(int i=0;i<100;i++){
                if(i!=10){
                    testDao.insert2(i);
                }else{
                    testDao.insert1(i);
                }
            }
        }catch(Exception e){
        }

    }

此时异常被捕获,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获,导致spring异常抛出触发事务回滚策略失效。

解决此类问题时,需要在try catch中显示的抛出夜歌RuntimeException 然后在Controller层捕获异常并编写返回值

全部代码如下:

spring 配置

<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
    <property name="alias" value="StarshineWorkspacePool"></property><!--别名-->
    <property name="driver" value="oracle.jdbc.driver.OracleDriver"/><!--驱动-->
    <property name="driverUrl" value="${common.db.url}"/><!--地址-->
    <property name="delegateProperties" value="user=${common.db.username},password=${common.db.password}"/><!--用户密码--> <!--用户密码 szfwszwdt  starshinegov-->
   <!--  starshinegov  szfwszwdt -->
    <property name="user" value=""/><!--无需填写但必须存在-->
    <property name="password" value=""/><!--无需填写但必须存在-->
    <property name="minimumConnectionCount" value="10"/><!--最小连接数 默认2-->
    <property name="maximumConnectionCount" value="100"/><!--最大连接数 默认5-->
    <property name="maximumActiveTime" value="1800000"/><!--检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程(毫秒)-->
    <property name="houseKeepingSleepTime" value="10000"/><!--侦察(自动)到空闲的连接就马上回收,超时的销毁(毫秒) 默认30秒-->
    <property name="prototypeCount" value="1"/><!--最少保持的空闲连接数 默认2-->
    <property name="simultaneousBuildThrottle" value="10"/><!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
    <property name="maximumConnectionLifetime" value="14400000"/><!--连接最大生命时间 默认4小时-->
    <property name="houseKeepingTestSql" value="SELECT CURRENT_DATE FROM DUAL"/><!--用于保持连接的测试语句-->
  </bean>
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
  </bean>
<!-- 开启AOP监听 只对当前配置文件有效 -->
  <aop:aspectj-autoproxy expose-proxy="true" />
  <!-- 开启注解事务 只对当前配置文件有效 -->
  <tx:annotation-driven transaction-manager="transactionManager" />
  <!--事务管理 -->
  <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>

  <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="send*" propagation="REQUIRED" />
      <tx:method name="add*" propagation="REQUIRED" />
      <tx:method name="save*" propagation="REQUIRED" />
      <tx:method name="login*" propagation="REQUIRED" />
      <tx:method name="create*" propagation="REQUIRED" />
      <tx:method name="insert*" propagation="REQUIRED" />
      <tx:method name="submit*" propagation="REQUIRED" />
      <tx:method name="update*" propagation="REQUIRED" />
      <tx:method name="modify*" propagation="REQUIRED" />
      <tx:method name="delete*" propagation="REQUIRED" />
      <tx:method name="remove*" propagation="REQUIRED" />
      <tx:method name="execute*" propagation="REQUIRED" />
      <tx:method name="destroy*" propagation="REQUIRED" />
      <tx:method name="get*" propagation="REQUIRED" read-only="true" />
      <tx:method name="load*" propagation="REQUIRED" read-only="true" />
      <tx:method name="find*" propagation="REQUIRED" read-only="true" />
      <tx:method name="*" read-only="true" />
    </tx:attributes>
  </tx:advice>
  <aop:config expose-proxy="true">
    <aop:pointcut id="txPointcut" expression="execution(* cn.com.wunvnv..service..*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
  </aop:config>

service 层代码

    @Resource
    TestDao testDao;
    public void insertMsg(ConversationBean conversationBean){
        try{
            for(int i=0;i<100;i++){
                if(i!=10){
                    testDao.insert2(i);
                }else{
                    testDao.insert1(i);
                }
            }
        }catch(Exception e){
            throw new RuntimeException();
        }

controller层代码

@ResponseBody
    @RequestMapping(value="/acceptMessage",method = RequestMethod.POST,
            produces = "application/json;charset=UTF-8")
    public InterfaceResult acceptMessage(@RequestBody ConversationBean conversationBean)  {
        try{
            acceptService.insertMsg(conversationBean);
            return InterfaceResult.successInterfaceResult();
        }catch(Exception e){
            return InterfaceResult.failedInterfaceResult("失败", "100");
        }

    }

原文地址:https://www.cnblogs.com/wululu/p/9405605.html

时间: 2024-07-31 23:58:27

spring 事物中遇到try catch 事物不会滚的相关文章

springboot(十一):Spring boot中mongodb的使用

mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,感兴趣的可以看看这篇文章:场屠戮MongoDB的盛宴反思:超33000个数据库遭遇入侵勒索,同时也说明了很多公司生产中大量使用mongodb. mongodb简介 MongoDB(来自于英文单词"Humongous",中文含义为"庞大&qu

Spring Boot(十一):Spring Boot 中 MongoDB 的使用

MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,同时也说明了很多公司生产中大量使用 Mongodb. MongoDB 简介 MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.基于分布式文件存储的数据库.由C++语言编

spring框架中使用junt单元测试

前言: 该代码适用于与spring框架整合的项目 代码: dao层的junit测试父类,需要在spring配置中注入两个bean <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationM

细说shiro之五:在spring框架中集成shiro

官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${version.shiro}</version> </dependency&g

[JavaEE - JPA] 3. Spring Framework中的事务管理

前文讨论了事务划分(Transaction Demarcation)在EJB中是如何实现的,本文继续介绍在Spring Framework中是如何完成事务划分的. 我们已经知道了当采用Container事务类型的时候,事务划分主要有以下两种方案(参考这里): 使用JTA接口在应用中编码完成显式划分 在容器的帮助下完成自动划分 在使用JavaEE的EJB规范时,这两种方案分别被实现为BMT以及CMT,关于BMT和CMT在上一篇文章中有比较详尽的讨论(参考这里). 那么对于Spring Framew

Spring MVC中基于注解的 Controller

终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响应请求.实际上,ControllerClassNameHandlerMapping, MultiActionController 和选择恰当的 methodNameResolver(如 InternalPathMethodNameResolver) 就已经可以在很大程度上帮助我们省去不少的 XML 配置,谁让

再析在spring框架中解决多数据源的问题

在前面我写了<如何在spring框架中解决多数据源的问题>,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注.在与网友探讨该问题的过程中,我发现我的方案并不完善,它只解决了一部分问题. 总结多数据源的问题,其实它需要分为以下三种情况:各个数据源的数据结构不同.各个数据源的数据结构相同.各个数据源的数据结构部分相同又有部分不同.对于第二种情况,各个数据源的数据结构相同,我们使用一个sessionFactory,而在sessionFactory中通

Spring AOP中的动态代理

0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1 JdkDynamicAopProxy 2.2 CglibAopProxy 3 总结 0  前言 前一个季度旅游TDC的Thames服务有几次宕机,根据组内原因认真查找发现是数据库事务造成的,后来把服务中的事务配置全部去掉,服务恢复正常.根据这次教训,虽然现在还是很难确定是哪一个方面的真正原因,但是激

Spring代码中动态切换数据源

在Spring-Mybatis中,有这样一个类AbstractRoutingDataSource,根据名字可以猜到,这是一个框架提供的用于动态选择数据源的类.这个类有两个重要的参数,分别叫 defaultTargetDataSource和targetDataSources.一般的工程都是一个数据源,所以不太接触到这个类. [html] <bean id="myoneDataSource" class="org.apache.commons.dbcp2.BasicData