트랜잭션 전파란?
트랜잭션 전파(Propagation)는 하나의 트랜잭션이 실행되고 있는 와중에 다른 새로운 트랜잭션이 실행되는 경우를 말한다.
Spring 트랜잭션 전파 처리의 개념과 원칙
본격적으로 스프링이 트랜잭션 전파를 처리하는 방식에 대해서 알아보자.
1. 외부 트랜잭션과 내부 트랜잭션
이때 기존의 실행되고 있던 트랜잭션을 외부 트랜잭션, 새롭게 실행된 트랜잭션을 내부 트랜잭션이라고 한다.
외부 트랜잭션은 최초의 트랜잭션이기 때문에 신규 트랜잭션이라고도 한다.
2. 물리 트랜잭션과 논리 트랜잭션
스프링은 동시에 실행되는 여러 개의 트랜잭션을 하나로 묶어 하나의 트랜잭션으로 만든다.
이때, 스프링은 물리 트랜잭션과 논리 트랜잭션이라는 개념을 사용하는데
묶인 하나의 트랜잭션을 물리 트랜잭션이라고 하고 그 물리 트랜잭션 안에 있는 트랜잭션들을 논리 트랜잭션이라고 한다.
최초의 트랜잭션은 외부 트랜잭션이자 논리 트랜잭션이 된다.
그 이후의 트랜잭션은 내부 트랜잭션이자 논리 트랜잭션이 된다.
3. 스프링 트랜잭션 전파의 원칙
스프링은 트랜잭션 전파를 다음 두 가지의 원칙을 가지고 처리한다.
1) 모든 논리 트랜잭션이 커밋돼야 물리 트랜잭션이 커밋된다.
2) 하나의 논리 트랜잭션이라도 롤백되면 물리 트린잭션은 롤백된다.
Spring의 트랜잭션 전파 처리 방식
지금부터 Spring이 트랜잭션 전파를 처리하는 방식에 대해 알아보자.
1. 외부 트랜잭션 커밋 , 내부 트랜잭션 커밋 - 커밋
모든 논리 트랜잭션이 커밋됐으므로 전체 물리 트랜잭션도 커밋된다.
구체적인 내부 동작은 다음과 같다.
- 내부 트랜잭션에서 커밋이 발생했다.
- 신규 트랜잭션이 아니기 때문에 실제 물리 트랜잭션의 커밋이 호출되지 않는다.
- 외부 트랜잭션에서 커밋이 발생했다.
- 신규 트랜잭션이기 때문에 실제 물리 트랜잭션의 커밋이 호출된다.
2. 외부 트랜잭션 롤백, 내부 트랜잭션 커밋 - 롤백
외부 트랜잭션이 롤백되었다. 하나의 논리 트랜잭션이라도 롤백되면 전체 물리트랜잭션은 롤백된다.
구체적인 내부 동작은 다음과 같다.
- 내부 트랜잭션이 커밋되었다.
- 신규 트랜잭션이 아니기 때문에 실제 물리 트랜잭션의 커밋이 호출되지 않는다.
- 물리 트랜잭션이 롤백되었다.
- 신규 트랜잭션이기 때문에 실제 물리 트랜잭션의 롤백이 호출된다.
3. 외부 트랜잭션 커밋, 내부 트랜잭션 롤백 - 롤백
내부 트랜잭션이 롤백되었다. 하나의 논리 트랜잭션이라도 롤백되면 전체 물리 트랜잭션은 롤백된다.
구체적인 내부 동작은 다음과 같다.
- 내부 트랜잭션이 롤백되었다.
- 신규 트랜잭션이 아니기 때문에 실제 물리 트랜잭션의 롤백이 호출되지 않는다.
- 이때 rollbackOnly라는 특성을 true로 설정한다.
- 외부 트랜잭션이 커밋되었다.
- 신규 트랜잭션이기 때문에 실제 물리 트랜잭션도 커밋이 호출될 것 같다.
- 하지만 실제로는 롤백이 호출된다. 그 이유는 내부 트랜잭션에서 rollbackOnly 특성을 true로 설정했기 때문이다.
- 외부 트랜잭션은 커밋이 되기 전에 rollbackOnly 특성을 확인하고 true로 설정되어 있다면, UnexpectedRollbackException을 발생시키며 롤백된다.
4. REQUIRES_NEW
외부 트랜잭션과 내부 트랜잭션을 분리하고 싶을 때는 REQUIRES_NEW특성을 사용하면 된다.
REQUIRES_NEW 특성을 사용하면 논리 트랜잭션의 결과가 다른 트랜잭션에 영향을 미치지 않는다.
실제로는 논리 트랜잭션으로 그 트랜잭션에 참여하는 것이 아닌 새로운 물리 트랜잭션을 만드는 것이다.
이렇게 되면 하나의 트랜잭션이 롤백되어도 다른 트랜잭션에 영향을 미치지 않게 된다.
구체적인 내부구조는 다음과 같다.
- REQUIRES_NEW 특성이 적용된 내부 트랜잭션이 롤백되었다.
- 이 경우 해당 트랜잭션은 신규 트랜잭션이 된다. 그렇기 때문에 실제 롤백이 호출된다.
- 외부 트랜잭션이 커밋되었다.
- 외부 트랜잭션은 원래 신규 트랜잭션이었기 때문에 실제 커밋이 호출된다.
해당 포스트는 김영한 님의 스프링 DB 2편 - 데이터 접근 활용 기술 강의를 기반으로 작성되었습니다.
출처: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2
'Spring > Spring Data' 카테고리의 다른 글
[Spring Data] Spring Transaction의 이해 (0) | 2024.06.08 |
---|---|
[Spring Data] QueryDSL (0) | 2024.06.07 |
[Spring Data] Spring Data JPA (0) | 2024.06.07 |
[Spring Data] JPA (0) | 2024.06.07 |
[Spring Data] MyBatis (0) | 2024.06.06 |