Java/Java
Spring @Transactional 주의점
ddss6565
2023. 7. 16. 00:27
동작원리
에러가 발생하는순간 해당 트랜잭션에 rollback-only 마킹 → 최종 커밋을 할 때 체크되어 롤백 실행
@Transactional 어노테이션은 Proxy로 구현되어 있기 때문에
self-invocation(동일 클래스 메소드 호출)에서는 작동하지 않음.
public static void main(String[] args)
{
save(); // 트랜잭션 안됨
}
@Transactional
public void save()
{
...
}
public static void main(String[] args)
{
userService.save(); // 트랜잭션 적용
userService.save2(); // 트랜잭션 안됨
}
@Transactional
public void save()
{
save2();
}
public void save2()
{
save();
}
기본적으로 CheckedException과 같이 예상가능한 예외는 롤백이 되지않고,
UncheckedException과 같이 예상불가능한 예외는 롤백처리 됨(RuntimeException, Error 등)
설정을 통해서 변경가능하지만 권장하지 않음.
예외처리 되지 않은 Exception 클래스에 대해서도 롤백을 실행하고 싶으면 아래와 같이 사용
@Transactional(rollbackFor = Exception.class)
@Transactional
public void saveTest(Map<String, Object> paramMap) throws Exception
{
txMapper.saveTest(paramMap);
throw new Exception("ABCD"); // => 롤백 안됨
}
@Transactional
public void saveTest(Map<String, Object> paramMap) throws Exception
{
txMapper.saveTest(paramMap);
try {
throw new Exception("ABCD"); // => 롤백 안됨
}
catch(Exception e) {
}
}
@Transactional
public void saveTest(Map<String, Object> paramMap) throws Exception
{
txMapper.saveTest(paramMap);
throw new RuntimeException("ABCD"); // => 롤백 됨
}
@Transactional
public void saveTest(Map<String, Object> paramMap) throws Exception
{
txMapper.saveTest(paramMap);
try {
throw new RuntimeException("ABCD"); // => 롤백 됨
}
catch(Exception e) {
}
}
반응형