서비스 계층 메서드
원자성 보장 : CRUD의 연산이 하나의 트랜젝션으로 묶여야 할때 사용
ex) -> 사용자의 계좌에서 돈 인출 -> 다른 계좌에 돈을 입금하는 경우, 두 연산 중 하나라도 실패하면 rollback 되어야 함.
일관성 유지 : DB의 상태를 일관되게 유지하기 위해 필요, 트랜잭션 내의 연산이 모두 성공해야만 db에 commit
TestCode에서의 사용
테스트 격리 : 테스트 코드에서 @Transacitonal을 사용하면 텟트 메서드가 완료될 때 트랜잭션이 자동으로 롤백. 테스트 환경이 실행 전후로 깨끗하게 유지 된다.
임시 데이터 사용 : 테스트 중에 임시로 데이트 추가, 수정하는 경우. 트랙젝션이 롤백되기 때문에, 테스트 이후 db에 영향을 주지 않음. 특히 단위테스트와 통합 테스트에서 유용.
데이터 일관성이 요구되는 경우
여러 db 테이블을 걸쳐 데이터 변경이 필요한 경우, 하나의 트랜잭션으로 묶어야 데이터 일관성 보장
지연로딩시 사용
엔티티의 연관 데이터를 지연로딩 (Lazy Loading), 해당 데이터에 접근하려면 트랜잭션이 활성화된 상태.
그렇지 않으면 LazyInitializationException 발생
읽기 전용 트랜잭션 : @Transactional(readOnly = true)로 설정하면 데이터베이스에 대한 읽기 작업만 수행
전파 수준 (Propagation): @Transactional에는 트랜잭션의 전파 수준(Propagation)을 설정할 수 있음. REQUIRED는 이미 진행 중인 트랜잭션이 있으면 해당 트랜잭션을 사용, 없으면 새 트랜잭션을 시작
격리 수준 (Isolation): 트랜잭션의 격리 수준을 설정, 동시에 여러 트랜잭션이 수행될 때, 일관성 문제 처리 결정. READ_COMMITTED, REPEATABLE_READ
트랜잭션 경계 설정: @Transactional을 서비스 계층 메서드에 설정하는 것이 일반적
성능 고려: 모든 메서드에 @Transactional을 남용하면 성능에 영향을 미칠 수 있다.
트랜잭션 전파: 트랜잭션의 전파 속성을 잘못 설정하면 의도하지 않은 트랜잭션 경계로 인해 데이터 일관성 문제가 발생