본문 바로가기
JAVA

@Transactional annotation 사용시에 try,catch 블록을 사용하면 유효하게 동작하지 않습니다.

by Hwoarang757 2024. 3. 7.

@Transactional Annotation 사용시에 try,catch 블록을 사용하면 유효하게 동작하지 않습니다.

 

예를 들면 Service 영역에서 ,  아래와 같은 형식으로 dao를 여러 번 호출 하여 INSERT 또는 UPDATE를 진행 하는 과정에서 어느단계에서라도 수행 실패 시에 전수 rollback 처리를 하기를 원한다면 , try , catch 블록을 사용하지 않고 throws Exception으로 처리하는 것이 방법이라고 생각 됩니다.

@Transactional
@Override
public booelan insertTest(Map<String,Object param) throws Exception {

	dao.aUpdate(param);

	dao.bInsert(param);
    
    boolean[] bResult = { true };
    
    // @Transactional 로 처리시에는 try , catch 사용시에 정상적으로 rollback 이 되지 않음
    /*
    Arrays.asList("A","B","C","D).forEach(a -> {
        // lambda forEach 안에서는 무조건 try,catch 로 묶어야 오류 발생하지 않음 
     	try {
      		dao.cInsert(param);
        }  catch(Exception exception) {
        	bResult[0] = false;
        }
    });
    
    // 강제로 Exception 을 발생 시켜도 rollback 이 되지 않았습니다. 
    if(!bResult[0]) throw new Exception();
    */
    
    // 아래와 같이 for 문으로 처리 하였을시에 Exception 이 발생하면 이전에 수행되었던 Transaction 에 대하여 
    // rollback 수행이 되었습니다.
    List<String> asList = Arrays.asList("A","B","C","D");
    
    for(String a : asList) {
       dao.cInsert(param);
    } 
   


}