码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-08-02 11:25:54      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:策略   bean   sql   send   prope   ica   .com   ali   默认   

依赖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 事物不会滚

标签:策略   bean   sql   send   prope   ica   .com   ali   默认   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!