해결된 질문
작성
·
420
·
수정됨
2
트랜잭션의 동작 원리에 대해서 정리해봤습니다.
제대로 이해했는지 확인 부탁드립니다! 혹시 잘못 이해하고 있는 부분이 있다면 말씀 부탁드립니다.
서비스 클래스의 메소드에 @Transactional
이 있으면 스프링은 해당 비즈니스 로직을 상속한 AOP 프록시 객체를 생성한 후, 이를 스프링 빈에 등록한다.
클라이언트가 해당 프록시
를 호출한다. (비즈니스 로직 자체를 호출하지 않는다)
스프링은 스프링 컨테이너에 등록된 트랜잭션 매니저
를 획득한다.
트랜잭션 매니저의 transactionManager.getTransaction()
을 호출하여 트랜잭션을 시작한다.
트랜잭션 매니저는 스프링 컨테이너에 등록된 데이터 소스
를 이용하여 커넥션
을 생성한다.
커넥션의 con.setAutoCommit(false)
호출로 수동 커밋 모드로 변환한다.
생성하고 설정을 끝낸 커넥션을 트랜잭션 동기화 매니저
에 보관한다.
실제 서비스를 호출하면, 서비스의 비즈니스 로직과 리포지토리의 데이터 접근 로직이 수행된다.
리포지토리의 데이터 접근 로직은 트랜잭션 동기화 매니저에 보관된 커넥션을 획득한 후 DB에 접근하여 SQL을 수행한다.
비즈니스 로직이 끝나면서 AOP 프록시에서 커밋
또는 롤백
을 통해 트랜잭션을 종료한다.
트랜잭션을 종료함으로써 커넥션은 커넥션 풀에 반납된다.
답변 1
0
안녕하세요. 김동민님, 공식 서포터즈 David입니다.
네, 잘 정리하셨습니다.
정리하신 내용 대부분이 트랜잭션 문제 해결 - 트랜잭션 AOP 정리에서 다뤄지고 있으니 참고 부탁드립니다.
감사합니다.
감사합니다!!