트랜잭션 개념 정리
트랜잭션은 논리적으로 연결된 작업 단위로, 모든 처리가 성공적으로 완료되거나 전혀 수행되지 않도록 보장합니다.
트랜잭션 특성 (ACID)
- 원자성: 트랜잭션은 분할될 수 없는 최소 실행 단위로, 전체 처리가 완료되거나 무효화됩니다.
- 일관성: 트랜잭션 수행 전후 데이터 상태가 일치해야 합니다.
- 격리성: 병행 처리 시 다른 트랜잭션의 영향을 받지 않도록 독립적인 데이터 공간을 유지합니다.
- 지속성: 커밋된 트랜잭션의 변경사항은 시스템 장애에도 불구하고 지속됩니다.
Spring 트랜잭션 관리 인터페이스
PlatformTransactionManager
Spring은 직접 트랜잭션을 관리하지 않고, JDBC, Hibernate 등 다양한 플랫폼에 맞는 트랜잭션 매니저를 제공합니다.
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
TransactionDefinition
트랜잭션 속성을 정의하는 인터페이스로, 격리수준, 전파행동, 타임아웃, 읽기전용 여부 등을 포함합니다.
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
}
TransactionStatus
트랜잭션 상태를 기록하는 인터페이스로, 신규 트랜잭션 여부, 복구점 존재 여부 등을 확인할 수 있습니다.
public interface TransactionStatus {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
핵심 개념 심화
격리수준
- ISOLATION_DEFAULT: DB 엔진의 기본 격리수준을 사용
- ISOLATION_READ_UNCOMMITTED: 가장 낮은 수준, 더티 리드 발생 가능성 있음
- ISOLATION_REPEATABLE_READ: 읽기 일관성 보장, 페인트 리드 가능
- ISOLATION_SERIALIZABLE: 가장 높은 격리수준, 성능 저하 유발
전파행동
| 전파행동 | 설명 |
|---|---|
| PROPAGATION_REQUIRED | 현재 트랜잭션 존재 시 참여, 없으면 새로 생성 |
| PROPAGATION_REQUIRES_NEW | 새로운 트랜잭션 시작, 기존 트랜잭션은 일시 중단 |
| PROPAGATION_NESTED | 중첩 트랜잭션 생성 (외부 트랜잭션 종료 시 자동 회복) |
타임아웃 및 읽기전용
트랜잭션 최대 실행 시간(초)과 읽기 전용 여부 설정이 가능합니다.
실제 적용 예시
데이터베이스 연결 정보를 설정하는 예시 구성:
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dbSource" />
</bean>