Transaction 관리

✒️ 2025-07-01 06:46 내용 수정


참고 자료 : Spring Using @Transactional, Geeksforgeeks Transaction Propagation and Isolation in Spring @Transactional Annotation

Transaction

데이터베이스의 작업을 처리하는 논리적 연산 단위

@Transactional

@Transactional // 클래스에 추가 시
@Service
public class TestServiceImpl implements TestService {
	@Override
	public Test getTest(Long id) {
		// ...
	}
}
@Service
public class TestServiceImpl implements TestService {
	@Override
	@Transactional // 메서드에 추가 시
	public Test getTest(Long id) {
		// ...
	}
}

Transaction Propagation

전파 타입 설명
REQUIRED 기본값
기존 트랜잭션이 있으면 참여하고, 없으면 새로 생성
REQUIRES_NEW 항상 새 트랜잭션 실행.
기존 트랜잭션이 있으면 일시 중단
SUPPORTS 기존 트랜잭션이 있으면 참여, 없으면 비트랜잭션 실행
NOT_SUPPORTED 기존 트랜잭션을 일시 중단하고 비트랜잭션으로 실행
MANDATORY 기존 트랜잭션이 반드시 있어야 함.
없으면 예외 발생
NEVER 기존 트랜잭션이 있으면 예외 발생. 반드시 비트랜잭션 실행
NESTED 중첩 트랜잭션이 존재하면 실행하고, 없다면 새로 생성
기존 트랜잭션 내에서 savepoint 생성.
rollback 시 savepoint까지 롤백
@Service
public class TestServiceImpl implements TestService {
	
	@Override
	@Transactional(propagation = Propagation.REQUIRED)
	public Test getTest(Long id) {
		// ...
	}
}

Transaction Isolation

격리 수준 설명
DEFAULT DB의 기본 독립 수준 사용
READ_UNCOMMITTED 다른 트랜잭션이 만든 uncommit된 변화를 읽을 수 있음
Dirty read, non-repeatable read, phantom read 모두 허용
READ_COMMITTED Dirty read 방지, non-repeatable/phantom은 허용 가능
REPEATABLE_READ Dirty/non-repeatable 방지, phantom은 허용 가능
SERIALIZABLE 격리 수준 가장 높음
모든 동시성 문제 방지
@Service
public class TestServiceImpl implements TestService {
	
	@Override
	@Transactional(isolation = Isolation.READ_COMMITTED)
	public Test getTest(Long id) {
		// ...
	}
}