트랜잭션은 DB에서 데이터 정합성과 일관성을 보장하는 핵심 개념이에요.
데이터베이스는 여러 사용자가 동시에 접근하거나 예상치 못한 오류나 장애가 발생할 수 있기 때문에 트랜잭션을 통한 안전한 데이터 처리가 필요합니다.
이번 글에서는 트랜잭션의 기본 개념, 중요성, ACID 원칙에 대해 살펴볼 거예요.
이후 시리즈에서는 트랜잭션의 동시성 제어와 격리 수준부터 분산 환경에서의 트랜잭션까지 차근차근 다룰 예정이에요.
<트랜잭션 시리즈 개요>
✅ 1편: 트랜잭션의 개념과 ACID 원칙 (이번글)
☑️ 2편: 트랜잭션의 격리 수준과 동시성 제어
☑️ 3편: 트랜잭션의 내부 동작과 분산 트랜잭션
☑️ 4편: 트랜잭션의 동작 원리와 직렬성 격리
1. 트랜잭션이란?
트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적인 작업 단위를 의미해요.
즉, 여러 개의 데이터 변경 작업을 하나로 묶어서 모두 성공하거나 모두 실패해야 하는 작업 단위입니다.
예를 들어, 은행에서 A계좌에서 B계좌로 계좌 이체를 한다고 가정해볼게요.
- A 계좌에서 100만 원 출금
- B 계좌에 100만 원 입금
이 두 가지 작업은 하나의 트랜잭션으로 처리해야 해요.
만약 1번 작업이 실행된 후 2번 작업이 실패하면 A 계좌에서 돈만 빠져나가고 B 계좌에는 입금되지 않는 문제가 생길 수 있어요.
이런 상황을 방지하기 위해 트랜잭션은 모든 작업이 성공해야만 최종적으로 반영되도록 보장해요!!!!
2. 트랜잭션이 해결하는 문제들
데이터베이스 시스템에서는 여러 가지 문제가 발생할 수 있어요.
트랜잭션이 없다면 개발자가 직접 이런 문제를 해결해야 하지만 트랜잭션을 활용하면 데이터 정합성을 자동으로 유지할 수 있어요.
cf) 데이터 정합성: 데이터 정합성(Data Integrity)이란 데이터가 정확하고, 신뢰할 수 있으며, 저장된 값이 논리적으로 올바른 상태를 유지하는 것을 의미해요.
이를 위해 기본 키, 외래 키, 제약 조건, 정규화 등을 활용하여 잘못된 데이터 입력이나 불일치를 방지해요
☑️ 소프트웨어 및 하드웨어 장애
- 서버가 갑자기 꺼지거나 네트워크 오류가 발생할 수 있어요.
- 트랜잭션을 통해 정합성을 해결할 수 있어요.
☑️ 동시성 문제
- 여러 사용자가 같은 데이터를 동시에 수정하면 데이터 충돌이 발생할 수 있어요.
- 예를 들어, 2명의 사용자가 동시에 같은 상품을 구매하면 재고가 음수가 될 수도 있어요.
(재고가 총 1개인 경우에 각각 1개씩 구매할 경우)
☑️ 일관성 문제와 트랜잭션의 역할
트랜잭션이 없거나 비정상적으로 종료되면 데이터베이스에서 일부 작업만 반영되고 나머지 작업이 적용되지 않는 일관성 문제가 발생할 수 있어요. (특히, 여러 테이블에 관련된 작업을 하는 경우 심각해짐)
📌 트랜잭션이 없을 때 발생하는 일관성 문제
트랜잭션 없이 여러 개의 SQL문을 실행하면 일부 작업은 성공하고 일부는 실패하는 상황이 발생할 수 있어요.
예시: 온라인 쇼핑몰 주문 처리
고객이 상품을 구매하면 아래 테이블에서 같은 작업이 필요해요.
1. orders 테이블에 주문 내역 추가
2. payments 테이블에 결제 정보 저장
3. inventory 테이블에서 재고 차감
<트랜잭션이 없는 경우 발생할 수 있는 문제>
- orders 테이블에 주문 정보는 저장됐지만 결제 단계에서 네트워크 오류가 발생하면?
→ 주문은 생성됐지만 결제는 이루어지지 않아 고객이 돈을 내지 않고 주문을 완료한 것 처럼 보임 - payments 테이블까지 성공했지만, inventory 테이블에서 재고 차감이 실패하면?
→ 고객은 결제를 했지만 재고가 없어 주문을 처리할 수 없어짐
이처럼 일련의 논리적 작업이 부분적으로만 반영되는 상황이 데이터의 일관성을 깨지는 경우입니다.
이러한 경우에는 트랜잭션을 사용하여 모든 작업이 성공해야만 최정적으로 반영되게 만들어줘야합니다.
만약 2번 단계(payments 테이블에 결제 정보 저장)에서 오류가 발생한다면 트랜잭션이 롤백되어 1번 단계(orders 테이블에 주문 내역 추가)의 주문 정보가 취소되어 일관성을 유지할 수 있습니다.
3. 트랜잭션의 4가지 원칙 (ACID)
트랜잭션이 데이터 정합성을 보장하려면 ACID 원칙을 따라야 해요.
ACID는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 약자예요.
1) 원자성 (Atomicity) - "All or Nothing"
- 트랜잭션은 모든 작업이 성공해야만 커밋(Commit)되고 실패하면 모든 작업이 롤백(Rollback)돼야 해요.
- 중간에 장애가 발생하면 이미 실행된 작업을 취소해서 데이터 정합성을 유지해야 해요.
2) 일관성 (Consistency) - "항상 올바른 데이터 유지"
- 트랜잭션이 실행된 후에도 데이터베이스는 항상 유효한 상태를 유지해야 해요.
3) 격리성 (Isolation) - "다른 트랜잭션과 독립적으로 실행"
- 여러 트랜잭션이 동시에 실행될 때 서로 영향을 주지 않도록 보장해야 해요.
4) 지속성 (Durability) - "트랜잭션이 커밋되면 영구적으로 저장"
- 트랜잭션이 성공적으로 커밋되면, 시스템 장애가 발생해도 변경된 데이터는 유지되어야 해요.
- 이를 위해 데이터베이스는 WAL(Write-Ahead Logging)를 활용해 트랜잭션의 변경 사항을 안전하게 저장해요.
ACID 원칙을 따르면 데이터베이스가 신뢰할 수 있는 데이터를 제공할 수 있어요.
4. 트랜잭션을 둘러싼 성능과 확장성 논쟁
만능처럼 보이는 트랜잭션은 데이터 정합성을 보장하지만 항상 이점만 제공하는 것은 아니랍니다..
특히 성능과 확장성에 영향을 미칠 수 있어서 대규모 분산 시스템에서는 트랜잭션을 완화하거나 아예 사용하지 않는 경우도 있어요.
📌 트랜잭션을 향한 상반된 입장
☑️ 트랜잭션이 중요해요!
- 데이터 정합성이 필수적인 애플리케이션에서는 트랜잭션이 반드시 필요해요.
- 금융 시스템, 온라인 쇼핑몰, 병원 기록 시스템 등 데이터 정합성이 필수적인 상황에서도 트랜잭션이 반드시 필요해요.
❌ 트랜잭션이 성능을 저하시켜요!
- 대규모 분산 시스템에서는 트랜잭션을 유지하는 것이 어렵고 성능 저하를 초래할 수 있어요.
- NoSQL 데이터베이스는 확장성을 위해 일부 트랜잭션 기능을 포기하기도 해요.
트랜잭션이 성능을 저하하는 것과 자세한 내용은 추후 정리해보도록 하겠습니다.
정리하며
이번 글에서는 트랜잭션의 기본 개념, 중요성, ACID 원칙, 트랜잭션이 해결하는 문제들을 살펴봤어요.
📌 핵심 정리
트랜잭션은 데이터 정합성을 유지하는 중요한 개념이에요.
트랜잭션이 없다면 동시성 문제, 장애 발생 시 데이터 손실 등의 문제가 발생할 수 있어요.
ACID 원칙(원자성, 일관성, 격리성, 지속성)을 통해 안전한 트랜잭션 처리가 가능해요.
하지만 성능과 확장성을 고려해 트랜잭션을 적절히 조정해야 해요.
다음 글에서는 트랜잭션의 격리 수준과 동시성 제어 방법을 다룰 예정이에요.
📌 다음 편 예고: "트랜잭션의 격리 수준과 동시성 제어 (2편)"
- 트랜잭션이 어떻게 동시 실행되는지?
- 격리 수준(Read Committed, Repeatable Read, Serializable)의 차이점
- 동시성 문제 해결 방법
트랜잭션이 어떻게 데이터베이스의 신뢰성을 유지하는지 더 깊이 파고들어 볼게요!
이 글은 마틴 클레프만(Martin Kleppmann)의 데이터 중심 애플리케이션 설계(Designing Data-Intensive Applications) 책을 참고하여 작성되었습니다. 확장 가능하며 유지보수하기 쉬운 데이터 시스템을 설계하는 핵심 개념을 다루고 있습니다.
'Server Developer > DataBase&Data Engineering' 카테고리의 다른 글
트랜잭션이란 무엇인가?(트랜잭션의 격리 수준과 동시성 제어) - Part2 (0) | 2025.02.13 |
---|---|
[DataBase] Homebrew를 사용하여 MySQL 설치하기 (Mac M1 Pro) (1) | 2023.01.23 |