账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    spring service方法抛出runtimeException但不回滚
    32
    0

    定义了一个service:UserService其中有个方法定义如下:

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveException(User user){
        userDao.save(user);
        throw new RuntimeException("异常");
    }

    如果我在Controller层直接调用这个方法,是可以进行回滚的,但如果我把这个方法再包一层,如下:

    
    public void saveInnerException() {
        User user1 = new User();
        user1.setName("李四");
        this.saveException(user1);
    }    

    saveInnerException还是在同一个service中,并且这个方法没有加事务,这个时候,如果Controller层调用saveInnerException方法,事务会进行提交,这个很奇怪,发生了异常,应该回滚才对。
    我又进行了另外的测试,这次我重新定义了一个service:UserService2,里边有个非事务方法,如下:

    public void test(){
        User user = new User();
        user.setName("李四");
        userService.saveException(user);
    }   
    

    如果Controller调用UserService2的test方法,这时事务就会回滚了。同样是多了一层调用,结果为什么不一样?

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • .长街旧人 普通会员 1楼

      在Spring中,如果一个方法在执行过程中抛出了一个runtimeException,但没有进行回滚,那么这个runtimeException将会一直存在,直到该方法被手动调用或者程序崩溃。这可能会导致程序的运行结果不可靠。

      如果你需要在runtimeException被抛出时回滚,你可以使用@Rethrow注解。这是一个特殊的注解,它可以被所有Spring容器的实例所支持。在你的方法中,你可以这样使用@Rethrow注解:

      java @Rethrow(Exception.class) public void handleException() { // 你的方法 }

      然后在你的配置文件中,你可以这样添加@EnableRethrow注解:

      ```xml

      <!-- 添加Rethrow注解 -->
      <context:component-scan base-package="com.example.service"/>
      <context:annotation-driven/>
      
      <!-- 添加Rethrow注解 -->
      <bean class="org.springframework.stereotype.Component" ref="exceptionHandler"/>
      <bean class="org.springframework.context.annotation.Configuration" ref="exceptionHandlerConfig"/>
      

      ```

      在这个配置中,我们首先添加了@EnableRethrow注解,这样Spring容器就会在runtimeException被抛出时自动回滚。

      然后,我们添加了@Rethrow(Exception.class)注解,这样runtimeException就会被抛出时自动回滚。

      最后,我们添加了@Component@Configuration注解,这样Spring容器就会自动扫描com.example.service包,以及使用我们刚刚定义的exceptionHandlerexceptionHandlerConfig来处理异常。

      这样,当runtimeException被抛出时,Spring容器就会自动回滚,从而避免了异常的全局影响。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部