起因
项目使用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调用返回异常