반응형
1. 스프링 컨테이너 기본전략
스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트를 사용합니다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료하게 됩니다.
=> 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 같다.
스프링을 사용하면 보통 @Transactional 어노테이션을 통해 트랜잭션을 사용하게 되는데 이 때 호출 메소드를 실행하기 직전에 스프링 트랜잭션 AOP가 먼저 발동하게 되고 이 후 메소드가 정상 종료되면 트랜잭션을 커밋하며 종료하는 흐름으로 진행됩니다.
트랜잭션을 커밋하면 JPA는 영속성 컨텍스트를 플러시해 변경내용을 DB에 반영한 후 데이터베이스 트랜잭션을 커밋합니다.
(예외가 발생하면 트랜잭션을 롤백하고 종료한다. 이 때는 플러시 호출 X)
2. 트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다.
트랜잭션 범위의 영속성 컨텍스트 전략은 트랜잭션이 같으면 항상 같은 영속성 컨텍스트를 사용하게 됩니다. 따라서 다른 엔티티 매니저를 사용하고 있다해도 같은 트랜잭션 범위에 있다면 같은 영속성 컨텍스트를 사용하게 됩니다.
여러 스레드에서 동시에 요청이 오는 경우는 어떨까요?
같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다른데 그 이유는 스프링 컨테이너가 스레드마다 각각 다른 트랜잭션을 할당하기 때문입니다. 이로 인해 멀티 스레드 상황에서도 비즈니스 로직에 집중할 수 있게 됩니다.
참고
자바 ORM 표준 프로그래밍
반응형
'Backend > JPA' 카테고리의 다른 글
[JPA] 프록시, 지연로딩, 즉시로딩은 무엇인가? (0) | 2024.06.17 |
---|---|
[JPA] Spring Data JPA란? (0) | 2024.06.12 |
[JPA] 영속성 컨텍스트 (0) | 2023.07.24 |
[JPA] JPA란 무엇일까? (0) | 2023.07.17 |
[JPA] @JpaDataTest에서 Auditing 기능 사용하기 (0) | 2023.06.23 |