이 글은 김영한님의 스프링 DB 2편 강의중 제목과 관련된 부분을 블로그장의 취향대로 요약한 것이며 강의 자료 및 출처는 가장 아래에서 확인할 수 있습니다.
트랜잭션이 여러개 있을때, @Transactional이 있을때, 없을때 이런 헷갈리는 부분에 대해 정확하게 짚어보자.
1. @Transactional유무에 따른 호출
1-1.@Transactional이 있는 A클래스의 메서드에서 없는 B클래스의 메서드를 호출
@Transactional은 그저 트랜잭션 프록시를 생성하여 트랜잭션을 처리하는 객체를 명확하게 분리해주고 트랜잭션을 사용하게 해주는 점만 주목하면된다.
1.A클래스의 메서드에서 트랜잭션을 시작하여 B클래스의 메서드를 호출한다.
2.트랜잭션은 처음부터끝까지 유지된다.
1-2.@Transactional이 없는 A클래스에서 있는 B클래스를 호출
@Transactional이 없기때문에 어떠한 트랜잭션도 실행하지 않는다.
따라서 트랜잭션이 없는 상태에서 B클래스를 호출하면 B클래스의 트랜잭션이 실행되게 되고, B클래스 호출이 끝난후 트랜잭션이 종료된다.
결과적으로 A클래스는 트랜잭션을 실행하지 않고, B클래스를 갔을때만 트랜잭션이 시작된다.
1.A클래스의 메서드에서 트랜잭션을 실행하지 않고, B클래스의 메서드를 호출한 시점부터 트랜잭션 시작한다.
2.트랜잭션은 B클래스의 메서드로직에만 적용한다.
2.트랜잭션 두 번 사용
2-1.외부에서 트랜잭션이 존재하는 A클래스의 메서드와 B클래스의 메서드를 각각 호출
A 메서드는 A메서드만의 트랜잭션을 가지고 B메서드는 B메서드만의 트랜잭션을 가진다.
각 메서드는 커밋이건 롤백이건 서로 영향을 주지않고 각각의 트랜잭션만 생각하면 된다.
1. 각각의 메서드는 각각의 트랜잭션을 가진다.
2. 서로 영향을 주지않는다.
2-2.트랜잭션이 실행되고 또 실행될때
스프링은 트랜잭션에 여러가지 전파 옵션을 제공하는데 그 중 기본 옵션인 REQUIRED를 기준으로 설명한다.
먼저, 스프링은 논리 트랜잭션과 물리 트랜잭션으로 개념을 나누는데, 물리 트랜잭션은 우리가 이해하는 실제 데이터베이스에 적용되는 트랜잭션이며, 논리 트랜잭션은 트랜잭션 매니져를 통해 트랜잭션을 사용하는 단위이다.
A클래스의 메서드(로직1)에서 트랜잭션을 시작하고 트랜잭션이 유지되고 있는 상태에서 B클래스의 메서드(로직2)의 트랜잭션이 시작된다.
만약, 트랜잭션이 실행되고 또 실행되면 위와 같이 B클래스의 트랜잭션이 A클래스의 트랜잭션에 합류하게 된다.
로직1에서 커밋이되고 로직2에서 커밋이되면 커밋이 두번인가?
로직1은 신규 트랜잭션이고, 로직2는 신규 트랜잭션이 아니다.
스프링 AOP는 내부적으로 트랜잭션 매니져를 사용한다.
트랜잭션 매니져는 커밋이나 롤백시 신규 트랜잭션을 체크한다.
따라서 로직2에서 트랜잭션 매니져는 신규 트랜잭션이 아닌것을 체크하고 로직2의 커밋을 무시하고 최종적으로 로직1의 커밋으로 끝이난다.
로직1에서 커밋이되고 로직2에서 롤백이되면?
로직2에서 롤백을 호출할때, 트랜잭션 매니져는 신규 트랜잭션을 체크한다.
신규 트랜잭션이 아니기때문에 롤백을 호출하지 않는다. 대신 트랜잭션 동기화 매니져에 rollbackOnly=true 표시를 해둔다.
이후 로직1에서 커밋이 될 때, 트랜잭션 동기화 매니져에있는 rollbackOnly 설정이 true인것을 확인하고 rollback을 호출하게 되며 스프링은 UnexpectedRollbackException 예외를 던진다.
즉, 정리하자면 아래와 같다
1. 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋된다.
2. 하나의 논리 트랜잭션이라도 롤백되면 물리 트랜잭션은 롤백된다.
* 실무 팁
실무에서는 대부분 REQUIRED 옵션을 사용한다.
아주 가끔 REQUIREDS_NEW를 사용하는데 REQUIRES_NEW는 항상 새로운 트랜잭션을 생성하는 전파 옵션이다. 만약 기존 트랜잭션이 있다면 이를 무시하고 새로운 트랜잭션을 생성한다.
* 출처 자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
'Spring' 카테고리의 다른 글
Spring Advanced 정리 2) 템플릿 메서드 패턴과 템플릿 콜백 패턴 (0) | 2024.03.25 |
---|---|
Spring Advanced 정리 1) 쓰레드 로컬 (0) | 2024.03.14 |
Spring DB 정리 3) 트랜잭션AOP 주의사항과 예외 처리 (0) | 2024.03.06 |
Spring DB 정리 2) 트랜잭션 처리 및 예외 처리 (0) | 2024.02.13 |
Spring DB 정리 1) JDBC,커넥션풀과 데이터소스 (0) | 2023.12.28 |