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

Posted wululu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");
        }

    }

 




以上是关于spring 事物中遇到try catch 事物不会滚的主要内容,如果未能解决你的问题,请参考以下文章

spring事务管理中,用try-catch处理了异常,事务也会回滚?

Try Catch 嵌套问题

spring事物回滚机制 (事务异常回滚,捕获异常不抛出就不会回滚)

数据库(批处理事物

异常处理(throw,throws,try,catch,finally)

使用try-catch