try-catch 가 이상 정 보 를 캡 처 한 후 Spring 업무 가 실 효 된 문 제 를 해결 합 니 다.

1.우선 Spring Boot 프로젝트 에서 수 동 으로 이상 한 방법 을 추가 하여 테스트 합 니 다.

@Transactional(rollbackFor=Exception.class) //           Spring  
@Override
public CommonResult<User> saveUser(User user) {
    int insert = baseMapper.insert(user);
    try {
        //     ,     
        int a = 10/0;
    }catch (Exception e){
        logger.info("      :"+e);
        return CommonResult.commentFailure("     ,    ");
    }
    if(insert > 0){
        return CommonResult.commentSuccess(user);
    }else {
        return CommonResult.commentFailure("    ");
    }
}
1.정 보 를 추가 하 는 실현 방법 에 있어 서 저 희 는 Spring 의 업 무 를 추 가 했 습 니 다.
2.문제:한 방법 으로 이상(int a=10/0)을 보고 하여 이상 캡 처 를 진행 하 였 으 며,다른 방법 은 스크롤 백 하지 않 습 니 다(insert 추가 방법)
이것 은 어떤 상황 입 니까?Spring 사무 전략 이 효력 을 잃 은 셈 입 니 다.
try-catch 가 이상 을 포착 한 후,이러한 업무 방법 은 spring 업무 의 관리 에서 벗 어 나 는 것 과 같 습 니 다.어떠한 이상 도 업무 방법 에서 던 져 지지 않 기 때문에 모두 캡 처 되 고'삼 키 기'되 어 spring 이상 이 트리거 트 랜 잭 션 스크롤 백 전략 이 효력 을 잃 게 됩 니 다.
일반적으로 기본 spring 사 무 는 캡 처 되 지 않 은 runtime excetpion 이나 error 가 발생 할 때 만 굴 러 갑 니 다.
처리 방안
spring op 이상 포획 후 스크롤 백.catch 에 마지막 으로 throw new runtime excetpion()을 추가 하면 프로그램 이 이상 할 때 op 에 잡 혀 스크롤 백 할 수 있 습 니 다.단점 은 return 이상 정보 알림 이 불가능 하고 전단 사용자 의 상호작용 효과 가 좋 지 않 습 니 다.

@Transactional(rollbackFor=Exception.class)  //           Spring  
@Override
public CommonResult<User> saveUser(User user) {
    int insert = baseMapper.insert(user);
    try {
        //     ,     
        int a = 10/0;
    }catch (Exception e){
        logger.info("    :"+e);
        //    :spring aop     
        throw new RuntimeException();
    }
    if(insert > 0){
        return CommonResult.commentSuccess(user);
    }else {
        return CommonResult.commentFailure("    ");
    }
}
3.처리 방안 2
하나의 방법 으로 이상 을 보고 하고 다른 방법 으로 스크롤 백 을 해 야 Spring 트 랜 잭 션 스크롤 백 전략 을 진정 으로 실행 할 수 있 습 니 다.
catch 구문 에 추가:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //    ,             
전체 코드:

@Transactional(rollbackFor=Exception.class) //           Spring  
@Override
 public CommonResult<User> saveUser(User user) {
     int insert = baseMapper.insert(user);
     try {
         //     ,     
         int a = 10/0;
     }catch (Exception e){
         logger.info("    :"+e);
         //    :    
         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
         return CommonResult.commentFailure("     ,    ");
     }
     if(insert > 0){
         return CommonResult.commentSuccess(user);
     }else {
         return CommonResult.commentFailure("    ");
     }
 }
4.수 동 으로 스크롤 백 을 해 야 하 는 업무 방법 이 비교적 많 으 면 우 리 는 공공 도구 류 를 쓸 수 있 습 니 다.
SpringRollBackUtil.java

public class SpringRollBackUtil {
    /**
     *       
     */
    public static void rollBack() {
        try {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
호출 방법 만 있 으 면 된다.

//    :          
SpringRollBackUtil.rollBack();
Spring mvc:트 랜 잭 션 으로 인 한 try/catch 실효
인 터 페 이 스 를 테스트 할 때 이상 한 현상 을 발견 합 니 다.
이 인 터 페 이 스 는@Response Body 주 해 를 사용 하여 json 형식 데 이 터 를 되 돌려 주 고 try/catch 를 사용 하여 모든 논리 코드 를 포함 합 니 다.debug 후 되 돌아 오 는 데 오류 가 없 음 을 발 견 했 습 니 다.이상 으로 인 한 오류 알림 문자열 만 포함 되 어 있 지만 chrome 브 라 우 저 network 는 http 상태 코드 를 500 으로 표시 합 니 다.
마지막 으로 이 RequestMapping 방법 에 주석 이 하나 더 있 음 을 발 견 했 습 니 다.@Transactional,ok 를 제거 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기