트랜잭션 관련 포스팅
- [Spring] 트랜잭션 추상화 정리
- [Spring] 트랜잭션 동기화 정리
- [Spring] 트랜잭션 AOP 동작 흐름
- [Spring] 트랜잭션 AOP 사용 시 주의점 (ft. Spring AOP self-invocation)
- [Spring] 스프링 트랜잭션 전파와 롤백
- [Spring] 트랜잭션 전파 옵션
리소스 동기화
- 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 데이터베이스 커넥션을 유지해야 한다
- 실제 SQL 실행은 세션을 통해 실행된다
- 즉, 세션이 트랜잭션을 시작하고 종료한다
트랜잭션 매니저와 트랜잭션 동기화 매니저
- 스프링은 트랜잭션 동기화 매니저를 제공한다
- 트랜잭션 동기화 매니저는 ThreadLocal을 사용해서 커넥션을 동기화해준다
- 트랜잭션 매니저는 내부에서 이 트랜잭션 동기화 매니저를 사용한다.
- 트랜잭션 동기화 매니저는 ThreadLocal을 사용하기 때문에 멀티쓰레드 상황에 안전하게 커넥션을 동기화할 수 있다
- 따라서 커넥션이 필요하면 트랜잭션 동기화 매니저를 통해 커넥션을 획득하면 된다
동작방식
- 트랜잭션을 시작하려면 커넥션이 필요하다. 트랜잭션 매니저는 데이터소스를 통해 커넥션을 만들고 트랜잭션을 시작한다.
- 트랜잭션 매니저는 트랜잭션이 시작된 커넥션을 트랜잭션 동기화 매니저에 보관한다.
- 리포지토리는 트랜잭션 동기화 매니저에 보관된 커넥션을 꺼내서 사용한다.
- 트랜잭션이 종료되면 트랜잭션 매니저는 트랜잭션 동기화 매니저에 보관된 커넥션을 꺼내 트랜잭션을 종료하고, 커넥션도 닫는다.
참고
'Spring > Spring' 카테고리의 다른 글
[Spring] 테스트 코드를 작성할 때 @Transactional을 주의하라 (4) | 2022.08.17 |
---|---|
[Spring] @Transactional과 메모리 DB를 활용한 데이터 접근 계층 테스트 (0) | 2022.08.13 |
[Spring] 트랜잭션 추상화 정리 (0) | 2022.08.08 |
[Spring] 스프링 DataSource 간단하게 정리 (0) | 2022.08.08 |
[Spring] 테스트 대상(@InjectMocks) Mocking & Stubbing하기 (0) | 2022.07.24 |