起因

项目使用seata进行分布式事务管理

项目使用了全局异常处理器来捕获异常

服务A执行分布式事务:

1.A中方法

2.用Feign调用B中方法,方法抛出异常

最终1.成功提交(未回滚),2.未提交

原因

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result<?> exceptionHandler(BaseException ex){
        log.error("异常信息:{}", ex.getMessage());
        BaseContext.removeCurrentId();
        return Result.error(ex.getMessage());
    }
}

全局异常处理器捕获异常,导致A中方法得到Feign调用的正常返回值,因此Seata认为无异常

解决

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Result<?> exceptionHandler(BaseException ex){
        log.error("异常信息:{}", ex.getMessage());
        BaseContext.removeCurrentId();
        return Result.error(ex.getMessage());
    }
}

通过添加响应状态码为4xx,5xx,即可令Feign调用返回异常