JPA에서 Transaction의 전파

이종윤·2022년 2월 13일
0

Spring JPA

목록 보기
17/23

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 : 트랜잭션이 존재할 경우 예외를 발생시키고, 트랜잭션이 없는 상태로 처리를 수행합니다.
    -트랜젝션이 없어야 한다.
profile
OK가자

0개의 댓글