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

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

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    两个service互相调用,抛出异常时的事务处理
    54
    0

    问题描述

    serviceA中的methodA调用serviceB中的methodB,methodB抛出一个异常,然后methodA捕获掉这个异常,就会出现
    Transaction rolled back because it has been marked as rollback-only 异常
    (serviceA和serviceB都加了注解@Transactional(rollbackFor = Exception.class))

    问题出现的环境背景及自己尝试过哪些方法

    业务需求是在serviceA中的methodA中调用serviceB中的methodB,但是methodB有一定几率会抛异常,methodA要把异常捕获,并做其他处理。
    但是methodA返回结果的时候就会报“Transaction rolled back because it has been marked as rollback-only”异常。
    解决办法是在methodB上添加注解@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)。还有一种办法是把methodB写到serviceA中,直接用this.methodB调用

    疑惑

    现在想搞明白为什么serviceA不能捕获serviceB中的异常?
    serviceA中的methodA中调用serviceB中的methodB和同一个service中两个方法调用,在事务处理上有什么区别?

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 溪水残风 普通会员 1楼

      在Java中,如果两个服务互相调用并抛出异常,你可以使用Spring Data JPA的事务管理功能来处理这些异常。

      以下是一个简单的例子:

      首先,你需要在你的Service中处理可能出现的异常:

      ```java @Service public class UserService {

      @Autowired
      private UserRepository userRepository;
      
      public User createUser(User user) {
          User savedUser = userRepository.save(user);
          return savedUser;
      }
      
      @ExceptionHandler(Exception.class)
      public ResponseEntity<User> createUserException(Exception e) {
          try {
              throw e;
          } catch (Exception e1) {
              return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e1.getMessage());
          }
      }
      

      } ```

      在这个例子中,createUserException方法是你的异常处理器。当你在Service中抛出一个异常时,这个方法会被调用。如果你试图捕获这个异常,你需要返回一个包含错误信息的ResponseEntity。

      如果你在Service中抛出一个可被处理的异常,你可以使用@ControllerAdvice来捕获这个异常:

      ```java @ControllerAdvice public classExceptionHandler {

      @ExceptionHandler(Exception.class)
      public ResponseEntity<User> createUserException(Exception e) {
          try {
              throw e;
          } catch (Exception e1) {
              return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e1.getMessage());
          }
      }
      

      } ```

      在这个例子中,createUserException方法会捕获所有类型的异常,并返回一个包含错误信息的ResponseEntity。

      请注意,你需要将这两个类放在Spring的配置文件中,例如applicationContext.xmlapplication.properties。你还需要确保你的服务配置正确,以便Spring知道如何处理这些异常。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部