멍
Spring @Transactional 본문
프로젝트가 거의 끝나고 잉여로운 시간을 맞았는데,
transactional annotation을 쓰긴 썼으나, 자세히 모르고 쓰는것 같아서 간략히 정리하고자
@Transactional annotation으로 트랜젝션 제어를 처리했다.
as is에서는 transaction manager를 따로 만들어서 썼는데, 이번엔 그러지 않았다.
commit, rollback 단위로 메서드를 새로 만들어 transactional을 씌워줬는데,
선언적 트랜젝션이라고 한다.
일단
propagation (전파) :
- REQUIRED : 디폴트 속성이다. 부모트랜젝션 내에서 실행되며, 부모 트랜젝션이 없다면 새로운 트랜젝션을 생성.
부모가 선언한 속성을 그대로 이어받는다.
- REQUIRES_NEW : 부모속성을 무시하고 새로운 트랜젝션으로 작동한다.
등등...
이번엔 REQUIRES_NEW를 이용해서 많이 구현했는데, 자꾸 db락이 걸리는 현상이 포착되었다..
무슨일인고
회원정보 수정 후 카드비밀번호를 수정하는 로직이 추가가 될일이 있었는데,
같은테이블에 다른두개의 트랜젝션이 참조하려는 시도가 포착되었다.
두개의 트랜젝션이 서로다르다 보니 일어난 일이었어서,
하나가 다 완료되고 커밋되면 다른걸 하도록 다시 구현했다.
암튼 그렇게 해결했던 일이 있었고,
이 Transactional은 기본적으로 UnCheckedException과 Error에 대해 rollback을 실행한다고 하는데,
처음든 생각은 UnCheckedException이랑 CheckedException은 자세히 뭐가다른건지..;
그리고 Exception과 Error의 차이도 대충은 알거같은데 어느부분이 다른점인지 잘모르겠더라
어디서 그림 주워온게 있어서 넣어본다.

Exception을 상속받는 RuntimeException은 조금 특별하게 취급한다.
java에서는 String도 Object상속받는데 특별하다고 했었다.
RuntimeException은 그래서 특별한 아이라 rollback 처리가 되어준다.

이걸 왜했냐면..
rollbackFor와 noRollBackFor 때문에 그런데
rollbackFor는 checked Exception들 중 rollback 처리해줄 놈들을 지정한다.
rollbackFor 에는 .class파일로 넣어줘야함
noRollbackFor 는 unchecked Exception들 중 롤백처리 안하고 싶을때가 있을때 그 class들을 넣어주면 된다.
나중에 다시보면 여기까진 이해가 될것같다.