JPA
트랜잭션 범위의 영속성 컨텍스트
주씨.
2024. 4. 25. 19:03
728x90
스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다.
이 말은 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻이다.
트랜잭션을 시작할 떄 영속성 컨텍스트를 생성하고, 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다.
같은 트랜잭션 내에서는 항상 같은 영속성 컨텍스트에 접근한다.
즉, 1트랜잭션 1PC
-- --
보통 서비스 계층에 @Transactional 어노테이션을 선언해서 트랜잭션을 시작한다.
이 어노테이션이 있으면 호출한 메서드를 실행하기 직전에 스프링의 트랜잭션 AOP 가 먼저 동작한다.
# 흐름도
트랜잭션 시작
⬇️
메서드 호출
⬇️
메서드 정상 종료
⬇️
Persistence Context flush
⬇️
DB 트랜잭션 커밋
--
만약 메서드에서 예외가 발생하면 트랜잭션을 롤백하고 종료하는데 이 때는 플러시를 호출하지 않는다.
▶️ 트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다.
▶️ 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다.
- 여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르다.
- 스프링 컨테이너는 스레드마다 각각 다른 트랜잭션을 할당한다.
- 따라서 같은 엔티티 매니저를 호출해도 접근하는 영속성 컨텍스트가 다르므로 멀티 스레드 상황에 안전하다.