Transaction 관리
✒️ 2025-07-01 06:46 내용 수정
참고 자료 : Spring Using @Transactional, Geeksforgeeks Transaction Propagation and Isolation in Spring @Transactional Annotation
Transaction
데이터베이스의 작업을 처리하는 논리적 연산 단위
- 상세 내용은 트랜잭션(Transaction) 참고.
- 가장 최소 작업 단위이며 원자성(Atomicity)을 가진다.
- 모든 동작이 정상적으로 완료되거나, 동작에 오류가 생겨서 취소되는 상태만 가질 수 있다.
- Spring에선
@TransactionalAnnotation을 사용하거나 XML 파일에서 Transaction을 설정할 수 있다.
@Transactional
- Transaction을 관리할 클래스나 메서드에
@TransactionalAnnotation을 추가한다. - 클래스에 선언 시 서브 클래스에도 Transaction이 적용되나, 조상 클래스에는 적용되지 않는다.
- 인터페이스나 인터페이스의 메서드에도
@Transaction을 추가할 수 있다.- 하지만 Annotation은 Transaction 동작을 하는 적절한 Bean을 식별하기 위한 메타 데이터이므로, Annotation 선언 만으론 실제 Transaction 동작을 수행하기엔 충분하지 않다.
- Spring team에서도 인터페이스의 메서드에
@Transaction을 선언하는 것보다 클래스에서 선언하는 것을 권장한다.
@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
- Transaction끼리 서로 연결할 방법을 설정한다.
- 이미 Transaction이 존재하는 상황에서 새 Transaction을 어떻게 실행할지 설정한다.
| 전파 타입 | 설명 |
|---|---|
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
- Transaction 독립(Isolation)는 Transaction이 다른 Transaction들과 독립된 상태에서 데이터 접근 방법을 정의하며, 트랜잭션이 두 개 이상 실행될 때 트랜잭션끼리 서로 영향을 얼마나 받지 않게 할지 결정한다.
| 격리 수준 | 설명 |
|---|---|
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) {
// ...
}
}