Spring @Transactional 본문

카테고리 없음

Spring @Transactional

violet4795 2021. 3. 25. 15:52

프로젝트가 거의 끝나고 잉여로운 시간을 맞았는데,

 

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의 차이도 대충은 알거같은데 어느부분이 다른점인지 잘모르겠더라

 

어디서 그림 주워온게 있어서 넣어본다.

 

 

 

출처 : https://madplay.github.io/post/java-checked-unchecked-exceptions

 

Exception을 상속받는 RuntimeException은 조금 특별하게 취급한다.

 

java에서는 String도 Object상속받는데 특별하다고 했었다.

 

RuntimeException은 그래서 특별한 아이라 rollback 처리가 되어준다.

 

 

출처 : https://madplay.github.io/post/java-checked-unchecked-exceptions

 

이걸 왜했냐면..

 

rollbackFor와 noRollBackFor 때문에 그런데

 

rollbackFor는 checked Exception들 중 rollback 처리해줄 놈들을 지정한다. 

 

rollbackFor 에는 .class파일로 넣어줘야함

 

noRollbackFor 는 unchecked Exception들 중 롤백처리 안하고 싶을때가 있을때 그 class들을 넣어주면 된다.

 

 

나중에 다시보면 여기까진 이해가 될것같다.