토비의 스프링을 진짜 오랜만에 펼쳐봤다,,
앞에만 보고 덮었었는데
뒤에 알아야되는 내용이 그득 했다,,
앞으로도 사전처럼 두고 봐야지 ㅎ_ㅎ
이번 포스팅은 @Transactional 속성에 대해서 알아보려고한당 (feat. 토비의 스프링~)
트랜잭션이란? 더 이상 쪼갤 수 없는 최소 단위의 작업
트랜잭션 매니저에서 트랜잭션을 가져올때 사용한 오브젝트는 DefaultTransactionDefinition이다.
Transaction status = this.transactionManager.getTransaction( new DefaultTransactionDefinition()); |
DefaultTransactionDefinition이 구현하고 있는 TrasactionDefinition 인터페이스는 트랜잭션 동작방식에 영향을 줄 수 있는 네가지 속성을 정의하고있다.
1. 트랜잭션 전파 ( Transaction propagation)
: 트랜잭션 경계에서 이미 진행중인 트랜잭션이 있을 떄 또는 없을 떄 어떻게 동작할 것인가를 결정하는 방식
- PROPAGATION_REQUIRED
:진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다
DefaultTransactionDefinition의 트랜잭션 전파 속성
- PROPAGATION_REQUIRES_NEW
: 항상 새로운 트랜잭션을 시작한다
독립적인 트랜잭션이 보장돼야 하는 코드에 적용
- PROPAGATION_NOT_SUPPORTED
: 트랜잭션 없이 동작하도록, 진행중인 트랜잭션이 있어도 무시한다.
=> 트랜잭션 매니저를 통해 트랜잭션을 시작할때, getTransaction()을 사용하는 이유는 바로 이 트랜잭션 전파 속성이 있기 때문이다.
- PROPAGATION_SUPPORT : 부모 트랜잭션 내에서 실행, 부모 트랜잭션이 없을 경우, notransactionally로 실행
- PROPAGATION_MANDATORY : 부모 트랜잭션 내에서 실행되며, 부모 트랜잭션이 없을 경우 예외 발생
- PROPAGATION_NEVER : notransactionally로 실행되며 부모 트랜잭션이 존재한다면 예외 발생
2. 격리 수준
: 모든 DB 트랜잭션은 격리수준 (isolation levlel)을 가지고 있어야 한다.
성능을 위해서 적절하게 격리수준을 조정해서 가능한 한 많으 트랜잭션을 동시에 진행시키면서도 문제가 발생하지 않게 하는 제어가 필요하다.
격리수준은 기본적으로 DB에 설정, JDBC드라이버나 DataSource 등에서 재설정, 필요하다면 트랜잭션 단위로 조정!
DefaultTransactionDefinition에 설정된 격리수준은 ISOLATION_DEFAULT이다. 이는 DataSource설정되어 있는 디폴트 격리수준을 따른다.
블로그에서 더찾아볼때 더있는데,, 모르겠당 @_@
3. 제한시간
: 트랜잭션의 수행하는 제한시간을 설정할 수 있다.
DefaultTransactionDefinition의 기본설정은 제한시간 음슴..
4. 읽기 전용
: 읽기전용(read only)로 설정하면 트랜잭션내 데이터 조작시도를 막을 수 있다. 성능이 향상 될수도 있다.
스프링이 제공하는 TransactonInterceptor에는 예외처리 두가지 방법이 있다.
1. 런타임 예외 발생 -> 트랜잭션 롤백
2. 체크예외 -> 예외상황으로 해석하지 않는다. 의미가 있는 리턴방식의 한가지로 인식해서 트랜잭션을 커밋한다.
@Transactional 어노테이션은 인터페이스, 클래스, 메소드에 쓸 수 있다.
해당 구현한 클래스에서도 모두 @Transactionl 어노테이션을 쓰고 싶으면 인터페이스에,
클래스에서만 쓰고 싶으면 클래스에
메소드별로 따로 가지고 가고싶으면 메소드에 쓰면된다
나같음 클래스나,,, 메소드 정도로만 쓸듯,,하다
ㅎㅎ 토비의 스프링을 보니깐 이해가 그래도 잘되는거 같당~
계속 읽어봐야짓 ㅎㅅㅎ
'DEVELOP > Backend' 카테고리의 다른 글
Spring에서 Async 처리 (@Async ) (0) | 2020.03.06 |
---|---|
테스트에서 @Transactionl 어노테이션 (0) | 2019.07.29 |
Filter, Interceptor, AOP의 차이 이해하기~! (0) | 2019.07.26 |
RestTemplate 를 이용하여 API Get 하기 (0) | 2019.06.12 |
JPA 의 개념과 간단 예제 (0) | 2019.03.11 |