Transaction의 전파(propagation)
JPA에서 Transaction 시작과 끝은 각 메서드의 시작과 끝이다. 하지만 현재있는 트랜젝션과 다른 클래스의 메서드 트랜젝션간의 처리가 어떻게 진행될까? 그 부분의 교통정리를 하는 부분이 propagation이다.
public enum Propagation { REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), NEVER(TransactionDefinition.PROPAGATION_NEVER), NESTED(TransactionDefinition.PROPAGATION_NESTED); ... ...
}
- REQUIRED : (Default) 만약 기존에 사용하던 **트렌젝션이 있다면** 그 트랜젝션을 **사용**하고 **없다면 생성**해서 사용한다. 어찌보면 가장 **직관적**이다. 트랜젝션이 필요한데 있다면 재활용하고 없다면 내가 직접 만들어서 사용하겠다는 뜻이다. save() 메서드가 REQUIRED 이다.
- save()는 한줄이 각각 Transaction처리가 되고 각각 커밋 된다.
- ex) putBookAndAuthor() 메서드안에 또 다른 Transaction을 만드는 메서드 save()와 putAuthor()가 있고, putAuthor가 실패하면 모두 실패한다.
- REQUIRES_NEW : **트랜잭션이 존재하는 경우** 해당 트랜잭션을 **잠시 보류**시키고, **신규 트랜잭션을 생성**합니다.
- 서로 완전히 독립적인 트랜젝션을 생성한다.
- ex) putBookAndAuthor() 메서드안에 또 다른 Transaction을 만드는 메서드 save()와 putAuthor()가 있고, putAuthor가 실패해도 다른 메서드는 commit된다.
- ex) 반대로 putAuthor()가 성공하고 putBookAndAuthor() 실패해도 putAuthor()은 커밋된다.
- NESTED : **트랜잭션이 존재할 경우 중첩된 트랜잭션(nested)을 생성**하여 처리를 수행하고, **존재하지 않을 경우**는 **Required와 동일**하게 동작합니다. **즉, 생성해서 사용한다.**
- 종속적인 하위 트랜젝션이 생기지만 상위 트렌잭션에 영향을 주지 않는다.
- savePoint 까지의 성공은 보장한다.
- 사용 많이 안한다.
- SUPPORTS : **트랜잭션이 존재할 경우** 해당 트랜잭션을 **사용**하고, **존재하지 않을 경우**는 트랜잭션을 **사용하지 않습니다.**
- 있으면 쓰고 없으면 안쓰겠다.
- NOT_SUPPORTED : **트랜잭션이 존재할 경우 잠시 보류**시키고, **트랜잭션이 없는 상태로 처리**를 수행합니다.
- 있어도 없는거 처럼 없으면 없음.
- MANDATORY : **트랜잭션이 존재할 경우** 해당 트랜잭션을 **이용**하며, **존재하지 않을 경우** **예외를 발생**시킵니다.
-필수적으로 트랜젝션이 있어야한다.
- NEVER : **트랜잭션이 존재할 경우 예외를 발생**시키고, **트랜잭션이 없는 상태로 처리**를 수행합니다.
-트랜젝션이 없어야 한다.
'Dev > JPA' 카테고리의 다른 글
JPA에서 Transaction 활용하기 (0) | 2022.03.02 |
---|---|
JPA Cascade (0) | 2022.03.02 |
영속성 컨텍스트(Entity LifeCycle) (0) | 2022.03.02 |
영속성 컨텍스트(Entity Cache) (0) | 2022.03.02 |
JPA M:N 연관관계 (0) | 2022.03.02 |