지난 포스팅에서 RDBMS가 데이터의 안정성과 일관성을 중요하게 생각한다고 배웠습니다.
오늘은 그 중심에 있는 핵심 메커니즘, 바로
트랜잭션(Transaction)
과 그것이 지켜야 할 4가지 약속인
ACID 원칙
에 대해 알아보겠습니다.
트랜잭션은 단순히 여러 개의 SQL 쿼리를 묶는 것을 넘어, 데이터베이스의 '신뢰'를 보장하는 매우 중요한 개념입니다.
우리가 은행을 믿고 돈을 맡길 수 있는 이유와도 같습니다.
왜 트랜잭션이 필요하고, ACID라는 약속이 어떻게 우리의 데이터를 안전하게 지켜주는지 그 원리를 파헤쳐 보겠습니다.
🚀
트랜잭션이란? 모두 아니면 전무 원칙 (All or Nothing) 🔗
트랜잭션
은 데이터베이스에서 수행되는
하나의 논리적인 작업 단위
를 의미합니다.
이 작업 단위는 하나 이상의 쿼리(데이터 추가, 수정, 삭제 등)로 구성될 수 있습니다.
트랜잭션의 가장 중요한 특징은 바로
모두 아니면 전무(All or Nothing)
라는 원칙입니다.
즉, 트랜잭션 안에 포함된 모든 작업이 전부 성공적으로 완료되어야만 그 결과를 데이터베이스에 최종적으로 반영(COMMIT)하고, 단 하나의 작업이라도 실패하면 모든 작업을 없었던 일로 되돌립니다(ROLLBACK).
가장 고전적이고 이해하기 쉬운 예는
계좌 이체
입니다.
A의 계좌에서 B의 계좌로 1만 원을 보내는 작업은 두 단계로 이루어집니다.
- A의 계좌에서 1만 원을 차감한다.
- B의 계좌에 1만 원을 추가한다.
만약 1번 작업만 성공하고, 시스템 오류로 2번 작업이 실패하면 어떻게 될까요?
A의 돈은 사라졌지만 B에게는 도착하지 않은, 돈이 공중분해되는 상황이 발생합니다.
트랜잭션은 이 두 작업을 하나의 덩어리로 묶어, 두 작업이 모두 성공해야만 결과를 저장하고, 하나라도 실패하면 1번 작업마저 취소하여 데이터의 모순을 막아줍니다.
데이터베이스는 트랜잭션이 안전하게 수행되는 것을 보장하기 위해, 반드시
ACID
라는 4가지 특성을 지켜야 합니다.
이것은 데이터베이스 시스템의 신뢰도를 평가하는 중요한 기준이 됩니다.
앞서 설명한 '모두 아니면 전무' 원칙입니다.
트랜잭션에 포함된 모든 작업은 마치 하나의 원자(Atom)처럼 더 이상 쪼갤 수 없는 한 묶음으로 취급되어, 전부 성공하거나 전부 실패해야 합니다.
트랜잭션이 성공적으로 완료되면, 데이터베이스는 항상
일관성 있는 상태
를 유지해야 합니다.
여기서 '일관성'이란, 데이터베이스에 정의된 여러 규칙(제약 조건, 데이터 타입 등)을 위반하지 않는 유효한 상태를 의미합니다.
예를 들어, '계좌의 잔액은 마이너스가 될 수 없다'는 규칙이 있다면, 트랜잭션의 결과로 특정 계좌의 잔액이 마이너스가 되는 경우는 절대 발생해서는 안 됩니다.
트랜잭션은 데이터베이스를 하나의 유효한 상태에서 또 다른 유효한 상태로 전환시켜야 할 의무가 있습니다.
여러 개의 트랜잭션이
동시에 실행될 때, 서로에게 영향을 주지 않고 독립적으로 실행되는 것처럼 보여야 한다
는 원칙입니다.
마치 여러 사람이 동시에 같은 문서를 편집하더라도, 각자의 작업이 다른 사람에게 방해받지 않는 것과 같습니다.
만약 고립성이 보장되지 않는다면, A 사용자가 아직 완료하지 않은 변경사항을 B 사용자가 읽어 잘못된 결정을 내리는 등의 문제가 발생할 수 있습니다.
예를 들어, 항공사의 마지막 남은 한 좌석을 두 명의 사용자가 거의 동시에 예약하려고 할 때, 고립성은 이 두 요청을 순서대로 처리하는 것처럼 격리하여 오직 한 명만 예약에 성공하도록 보장해 줍니다.
성공적으로 완료(COMMIT)된 트랜잭션의 결과는
영구적으로 데이터베이스에 기록되어야 한다
는 원칙입니다.
COMMIT이 완료된 후에는 시스템에 장애가 발생하거나 전원이 꺼지더라도, 데이터는 사라지지 않고 그대로 남아있어야 합니다.
데이터베이스는 보통 이를 보장하기 위해 변경 사항을 로그로 남겨두고, 장애 발생 시 이 로그를 사용해 데이터를 복구합니다.

ACID 원칙
트랜잭션과 ACID는 데이터베이스 지식의 근간이므로, 면접에서 그 이해도를 깊이 있게 확인합니다.
✅
1. 트랜잭션이란 무엇이며 왜 필요한가요? 🔗
개념과 필요성을 함께 설명하는 것이 핵심입니다.
트랜잭션은 '모두 아니면 전무' 원칙에 따라 동작하는 하나의 논리적인 작업 단위입니다.
데이터베이스의
데이터 무결성과 일관성을 보장
하기 위해 반드시 필요합니다.
예를 들어 계좌 이체와 같이 여러 단계로 이루어진 작업이 중간에 실패했을 때, 트랜잭션은 모든 변경 사항을 원상 복구하여 데이터가 오염되거나 모순된 상태에 빠지는 것을 방지해 줍니다.
✅
2. ACID의 각 속성에 대해 실제 예시를 들어 설명해주세요. 🔗
각 속성의 개념을 얼마나 명확히 이해하고 있는지 확인하는 질문입니다.
원자성
은 계좌 이체 시, 출금과 입금 작업이 모두 성공하거나 모두 실패하는 것을 보장하는 것입니다.
일관성
은 잔액이 마이너스가 될 수 없다는 규칙이 있을 때, 트랜잭션 후에도 이 규칙이 깨지지 않는 상태를 유지하는 것입니다.
고립성
은 두 사람이 동시에 마지막 항공 좌석을 예약할 때, 한 사람의 작업이 다른 사람의 작업에 영향을 주지 않아 오직 한 명만 성공하도록 보장하는 것입니다.
지속성
은 '예약 완료' COMMIT이 끝난 후에는, 서버에 정전이 발생해도 예약 내역은 절대 사라지지 않는 것을 의미합니다.
오늘은 데이터베이스의 신뢰를 떠받치는 기둥, 트랜잭션과 ACID 원칙에 대해 알아보았습니다.
트랜잭션
은 '모두 아니면 전무' 원칙으로 동작하는 하나의 논리적 작업 단위입니다.
ACID
는 트랜잭션이 안전하게 수행되기 위한 4가지 필수 조건입니다.
원자성(Atomicity)
: 모두 성공하거나 모두 실패한다.
일관성(Consistency)
: 데이터는 항상 유효한 상태로 남는다.
고립성(Isolation)
: 트랜잭션들은 서로를 방해하지 않는다.
지속성(Durability)
: 성공한 결과는 영원히 기록된다.