JAVA
@Transactional annotation 사용시에 try,catch 블록을 사용하면 유효하게 동작하지 않습니다.
Hwoarang757
2024. 3. 7. 02:02
@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);
}
}