트랜잭션(Transaction)은 데이터베이스나 애플리케이션에서 하나의 작업 단위를 구성하는 논리적 연산 집합입니다. 트랜잭션은 주로 여러 작업이 하나의 논리적 그룹으로 묶여서 실행되어야 하는 경우 사용됩니다. 트랜잭션의 가장 중요한 특징은 ACID 속성을 따르는 것입니다.
트랜잭션의 주요 특징 (ACID)
-
Atomicity (원자성)
- 트랜잭션은 모두 성공하거나 모두 실패해야 합니다.
- 중간에 문제가 발생하면 모든 작업이 원래 상태로 롤백(rollback) 되어야 합니다.
- 예: 계좌 이체 중 하나의 계좌에서 돈이 빠져나갔지만 다른 계좌로 입금되지 않으면 전체 작업이 무효 처리됩니다.
-
Consistency (일관성)
- 트랜잭션 실행 전과 후의 데이터 상태가 일관성을 유지해야 합니다.
- 예: 데이터베이스의 무결성 제약 조건이 항상 만족되어야 합니다.
-
Isolation (고립성)
- 여러 트랜잭션이 동시에 실행되더라도 서로 간섭하지 않아야 합니다.
- 트랜잭션이 완료되기 전까지는 다른 트랜잭션에서 중간 상태를 볼 수 없습니다.
- 예: 두 사용자가 동시에 같은 제품의 재고를 수정할 때 데이터가 꼬이지 않도록 보호.
-
Durability (지속성)
- 트랜잭션이 성공적으로 완료되면, 그 결과는 시스템 오류가 발생하더라도 영구적으로 반영됩니다.
- 예: 성공적으로 주문이 완료되면 서버가 다운되어도 주문 기록이 사라지지 않음.
트랜잭션의 동작 과정
- Begin Transaction: 트랜잭션 시작.
- Execute Operations: 트랜잭션 내 작업 실행.
- Commit: 모든 작업이 성공적으로 완료되었을 때 데이터베이스에 변경사항 반영.
- Rollback: 오류가 발생하거나 문제가 생길 경우 트랜잭션 내 모든 작업 취소.
트랜잭션의 예시
-
은행 계좌 이체
- 계좌 A에서 100원을 인출하고, 계좌 B에 100원을 입금하는 작업.
- 두 작업 중 하나라도 실패하면 트랜잭션 전체가 롤백됩니다.
-
전자상거래
- 상품 주문 시, 주문 정보 저장, 결제 처리, 재고 감소 등이 한 트랜잭션으로 묶임.
- 하나라도 실패하면 모든 작업이 취소됩니다.
트랜잭션 격리 수준 (Isolation Levels)
격리 수준은 동시에 실행되는 트랜잭션 간 간섭을 얼마나 허용할지 결정합니다. 대표적으로 아래 네 가지가 있습니다.
-
Read Uncommitted
- 다른 트랜잭션이 커밋하지 않은 변경사항도 읽을 수 있음.
- 가장 낮은 격리 수준, 데이터 일관성 문제 발생 가능성 높음.
-
Read Committed
- 다른 트랜잭션이 커밋한 데이터만 읽을 수 있음.
- 대부분의 RDBMS 기본 설정.
-
Repeatable Read
- 트랜잭션이 시작된 후 읽은 데이터가 다른 트랜잭션에 의해 변경되지 않도록 보장.
- 팬텀 리드(Phantom Read)는 발생 가능.
-
Serializable
- 가장 높은 격리 수준, 트랜잭션 간 완전한 고립 보장.
- 동시성이 낮아 성능 저하 가능성.
Spring에서 트랜잭션
Spring 프레임워크는 @Transactional
어노테이션을 통해 트랜잭션 관리를 쉽게 처리할 수 있습니다.
@Service
public class OrderService {
@Transactional
public void placeOrder(Order order) {
orderRepository.save(order);
paymentService.processPayment(order.getPaymentInfo());
}
}
- 위 코드에서
@Transactional
은 placeOrder
메서드가 하나의 트랜잭션으로 실행됨을 보장합니다.
- 실패 시 자동으로 롤백됩니다.
트랜잭션은 데이터 일관성과 안정성을 유지하는 핵심 요소입니다.
추가 학습 자료