1. 트랜잭션
- 한 묶음으로 처리되어야 하는 작업 (SQL 명령문) 들의 집합
- 커밋 (commit)
- “정상 종료”
- 트랜잭션의 실행 결과를 DB에 최종 반영하는 것
- 롤백 (rollback)
- 트랜잭션의 실행 결과를 반영하지 않고 취소하여 원래 상태로 되돌리는 것
2. 트랜잭션의 ACID 특성
- Atomicity (원자성)
- 트랜잭션 안의 작업을 모두 성공적으로 완료 or 모두 철회하여 무효화 해야 함
- Consistency (일관성)
- DB가 트랜잭션 실행 전의 일관된 상태 → 트랜잭션 실행 후 또 다른 일관된 상태 로 전환되어야 함
- Isolation (고립성)
- 여러 개의 트랜잭션이 독립적으로 실행 되어야 함
- 커밋될 때까지 트랜잭션이 수행한 임시 실행 결과가 다른 트랜잭션에게 공개되지 않아야 함
- Durability (지속성)
- 일단 트랜잭션이 커밋되면 실행 결과는 종료 또는 장애가 발생하더라도 보존되어야 함
- 커밋된 트랜잭션의 결과는 최종적으로 안정된 저장 장치에 반영
3. Spring 에서의 트랜잭션 관리
- Transaction Manager
- DB와의 트랜잭션 관리
- ex) DataSourceTransactionManager (JDBC 기반)
HibernateTransactionManager (하이버네이트 기반)
JpaTransactionManager (JPA 기반)
@Configuration
public class TransactionConfig {
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
- Transactional boundaries
3-1. @Transactional
- 스프링에서 트랜잭션 경계를 설정하기 위한 어노테이션
- 메서드 또는 클래스의 실행 → 하나의 트랜잭션으로 묶음 ⇒ 데이터 일관성 보장!
3-1-1. 주요 속성
- propagation : 트랜잭션 전파 방식 설정
- REQUIRED : 현재 트랜잭션 존재 시 사용, 없으면 새로 생성
- REQUIRES_NEW : 항상 새 트랜잭션 생성, 기존 트랜잭션 중단
- NESTED : 중첩 트랜잭션 (지원하는 경우에만)
@Transactional(propagation = Propagation.REQUIRED)
public void method2() {
method1(); // 같은 트랜잭션 사용
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method1() {
// 항상 새 트랜잭션 생성
}
- isolation : 트랜잭션 격리 수준 설정
- READ_UNCOMMITTED : 다른 트랜잭션의 변경사항 읽기 가능
- READ_COMMITTED : 다른 트랜잭션의 커밋된 변경사항만 읽기 가능
- REPEATABLE_READ : 동일 쿼리 결과 일관성 유지
- SERIALIZABLE : 가장 높은 격리 수준, 완전한 독립성 보장
@Transactional(isolation = Isolation.SERIALIZABLE)
public void method3() {
// 가장 높은 격리 수준을 필요로 하는 작업
}
- timeout : 트랜잭션 타임아웃 설정
- rollbackFor : 롤백할 예외 지정
@Transactional(rollbackFor = MyException.class)
public void method4() throws MyException {
// MyException 발생 시 롤백
}
'Spring Boot' 카테고리의 다른 글
[Spring Boot] JpaRepository 개념, 사용 방법 (쿼리 메서드, @Query, JPQL, Native Query) (0) | 2024.09.05 |
---|---|
[Spring Boot] ResponseEntity 사용 이유, 사용 방법 (1) | 2024.09.05 |
[Spring Boot] 스프링 ChatGPT API 활용 예제 ( + postman으로 확인 ) (0) | 2024.09.04 |
[Spring Boot] 스프링 이미지 업로드 예제 (3) - 외부 경로에 업로드 (0) | 2024.09.03 |
[Spring Boot] 스프링 이미지 업로드 예제 (2) - DB에 이미지 직접 저장 (0) | 2024.09.02 |