Transaction Manager 4/ 패스트캠퍼스 챌린지 18일차

망고쥬스·2021년 11월 18일
0

현재의 Transaction과 또 다른 Method의 Transaction간의 처리가 어떻게 진행되는지에 대해 알아보겠습니다.

Transaction 의 전파 (Transaction Propagation)

  • Required : 만약 Transaction을 선언만하고 Propagation에 대한 아무 옵션도 취하지 않을 때의 기본값 (Default)
    기존에 사용을 하던 Transaction이 있다면 해당 Transaction을 사용하며, 만약 없다면 새로운 Transaction을 생성 해 사용한다.
    ex: repository.save()

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 처리.

  • Savepoint를 설정해두면 해당 포인트까지의 성공은 보장하게 된다.

Support , Not_supported

Support는 호출하는 쪽에서 Transaction이 있다면 해당 트랜잭션을 재 활용하게 된다 (REQUIRED와 비슷),
만약 트랜잭션이 없다면 Support는 새로 생성하지 없고 트랜잭션 없이 처리하게 된다.

Not_Supported 호출하는 쪽에서 Transaction을 가지고 있으면 멈춘다. (Requires_new와 비슷)

MANDATORY

필수적으로 이미 생성 된 Transaction이 존재해야한다. 없으면 오류가 발생되게 된다.

NEVER

트랜잭션이 존재하면 안된다. 이미 존재하고 있다면 오류가 발생된다.


코딩의 트렌드가 가독성 있는 네이밍이라 변수명들을 잘 살펴보면 어느정도 이해가 가능하다 Jpa에서 여러가지 타입의 트랜잭션을 제공 해 주고 있다. 하지만 실제로 사용하게 되는 것들은 특별한 경우가 아니면 Reqired나 Reqires_new 정도만 사용한다고 생각하면 된다. 물론 제공하고 있는 기능에 대해서는 학습해 두는 것은 좋다. 일반적으로 Transaction의 흐름을 제어할 정도로 어려운 코드를 생성하는 경우는 드물다.

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는Java/Spring웹개발마스터초격차패키지Online

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3FVdhDa

profile
#newbieDeveloper #since 2021.04.06

0개의 댓글