Dev/JPA

JPA에서 Transaction의 전파

OK-가자 2022. 3. 2. 17:30

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