현재의 Transaction과 또 다른 Method의 Transaction간의 처리가 어떻게 진행되는지에 대해 알아보겠습니다.
Transaction 의 전파 (Transaction Propagation)
BookService
@Transactional(propagation = Propagation.REQUIRED)
public void putBookAuthor(){
Book book = new Book();
book.setName('JPA시작하기');
bookRepository.save(book);
authorService.putAuthor();
throw new RuntimeException("오류가 발생하여 DB Commit이 발생하지 않습니다.");
}
AuthorService
@Service
@RequiredArgsConstructor
public class AuthorService{
private final AuthorRepository repository;
@Transactional(propagation = Propagation.REQUIRED)
public void putAuthor(){
Author author = new Author();
author.setName("martin");
repository.save(author);
}
Book, Author 둘 다 커밋이 정상적으로 이루어진다.
만약 Book에서 오류가 나 commit이 되지 않고 rollback 처리가 된다면
Author또한 같이 오류가 발생하고 rollback처리가 되게 된다.
왜나하면 book에서 생성 된 Transaction이 author에서 재 활용 되서 사용되기 때문이다.
Requires_new
Require은 transaction이 있으면 재활용 하지만, new는 있던 없던 상관없이 새로운 Transaction을 사용하게 된다.
호출하는 쪽에 commit과 상관없이 자체적으로 commit 혹은 rollback을 진행하게 된다.
AuthorService
: bookService는 동일하게 가져간다
@Service
@RequiredArgsConstructor
public class AuthorService{
private final AuthorRepository repository;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void putAuthor(){
Author author = new Author();
author.setName("martin");
repository.save(author);
}
이렇게 Transaction을 진행하게 되면 각각의 트랜잭션을 사용하게 된다.
Book의 성공여부와 관계없이 Author는 자체적으로 commit이 될 수도, 오류시 rollback 될 수도 있다.
Nested
AuthorService
: bookService는 동일하게 가져간다
@Service
@RequiredArgsConstructor
public class AuthorService{
private final AuthorRepository repository;
@Transactional(propagation = Propagation.NESTED)
public void putAuthor(){
Author author = new Author();
author.setName("martin");
repository.save(author);
}
RERUIRED 옵션처럼 하나의 트랜잭션으로 관리 되지만, 실질적으로 분리되어 운영이 가능하다.
즉 하나의 트랜잭션, 분리관리 이다.
Author에서 실패가 발생되면 Author를 rollBack이 일어나지만
기존에 실행했던 book의 경우에는 정상적으로 실행되게 된다.
만약 book이 실패가 되면 book과 author가 같이 롤백이 일어나게 된다.
Book 실행 - 성공(Commit) >>> Author 실행 - 실패 (rollback) :: book만 commit
Book 실행 - 실패(Rollback) >>> Author 실행 - 성공(Commit) :: 둘 다 rollback 처리.
Support , Not_supported
Support는 호출하는 쪽에서 Transaction이 있다면 해당 트랜잭션을 재 활용하게 된다 (REQUIRED와 비슷),
만약 트랜잭션이 없다면 Support는 새로 생성하지 없고 트랜잭션 없이 처리하게 된다.
Not_Supported 호출하는 쪽에서 Transaction을 가지고 있으면 멈춘다. (Requires_new와 비슷)
MANDATORY
필수적으로 이미 생성 된 Transaction이 존재해야한다. 없으면 오류가 발생되게 된다.
NEVER
트랜잭션이 존재하면 안된다. 이미 존재하고 있다면 오류가 발생된다.
#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는Java/Spring웹개발마스터초격차패키지Online
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.