ACID
contents
1. 트랜잭션(Transaction)이란?
ACID를 이해하기 전에 트랜잭션을 정의해야 합니다. 트랜잭션은 여러 개의 작업(읽기, 쓰기, 수정)을 하나의 논리적 작업 단위로 묶은 것입니다.
- 고전적인 예시: 은행 이체
- 1단계: A의 통장에서 100원을 뺀다.
- 2단계: B의 통장에 100원을 더한다.
ACID는 이 과정이 엉망이 되거나 데이터가 깨지지 않도록 데이터베이스가 제공하는 안전 보장 장치입니다.
2. A - Atomicity (원자성 - "전부 아니면 전무")
원자성은 트랜잭션이 더 이상 쪼개질 수 없음을 보장합니다.
- 규칙: 트랜잭션 내의 모든 작업이 성공하거나, 아니면 아무것도 실행되지 않아야 합니다. "절반만 성공"이라는 것은 존재할 수 없습니다.
- 시나리오:
- A의 통장에서 돈을 뺐습니다 (성공).
- B의 통장에 돈을 넣기 전에 정전이 발생했습니다 (실패).
- 원자성이 없다면: A의 돈은 사라졌고, B는 돈을 못 받았습니다. 돈이 증발했습니다.
- 원자성이 있다면: 재부팅 시 DB는 트랜잭션이 완료되지 않았음을 감지합니다. 롤백(Rollback) 을 수행하여 A의 출금을 취소합니다. 마치 아무 일도 없었던 것처럼 되돌립니다.
- 기술적 원리: 데이터베이스는 Undo Log를 사용합니다. 데이터를 바꾸기 전에 원래 값 을 미리 적어둡니다. 사고가 나면 이 로그를 보고 복구합니다.
3. C - Consistency (일관성 - "규칙 준수")
일관성은 트랜잭션이 완료된 후, 데이터베이스가 항상 유효한 상태에서 또 다른 유효한 상태로 이동해야 함을 보장합니다.
- 규칙: 데이터베이스에 정의된 모든 제약 조건(Constraints), 규칙, 트리거를 위반해서는 안 됩니다.
- 시나리오:
- 제약 조건:
잔액컬럼은 음수가 될 수 없다 (CHECK (balance >= 0)). - A가 50원을 가지고 있는데 100원을 이체하려고 합니다.
- 결과: 수학적으로는 계산이 되지만 (-50원), 일관성 규칙을 위반합니다. 데이터베이스는 트랜잭션 전체를 거부하고 에러를 냅니다.
- 제약 조건:
- 차이점: Atomicity는 물리적 오류(하드웨어/소프트웨어 크래시)로부터 보호하고, Consistency는 논리적 오류(데이터 규칙 위반)로부터 보호합니다.
4. I - Isolation (격리성 - "프라이빗 룸")
격리성은 동시에 실행되는 트랜잭션들이 서로 방해하지 못하도록 보장합니다.
- 규칙: 트랜잭션 수행 중의 중간 상태는 다른 트랜잭션에게 보이면 안 됩니다. 동시에 여러 트랜잭션을 수행한 결과는, 마치 하나씩 순서대로(Sequentially) 실행한 결과와 같아야 합니다.
- 시나리오 (Dirty Read):
- 트랜잭션 A: A의 돈을 뺍니다 (잔액 0원) ... 아직 처리 중.
- 트랜잭션 B: A의 잔액을 조회합니다.
- 격리성이 없다면: B는 0원을 봅니다. 그래서 대출을 거절합니다. 그런데 A의 트랜잭션이 실패해서 롤백됩니다 (다시 100원). B는 "존재한 적 없는 데이터"를 보고 의사결정을 한 셈이 됩니다.
- 격리성이 있다면: A가 끝날 때까지 B는 대기하거나(Lock), 변경 전의 스냅샷(MVCC)을 보게 됩니다.
5. D - Durability (지속성 - "돌에 새김")
지속성은 트랜잭션이 일단 커밋(Commit) 되면, 시스템 장애(정전, 서버 다운)가 발생하더라도 데이터가 영구적으로 보존됨을 보장합니다.
- 규칙: 데이터베이스가 당신에게 "성공" 메시지를 보냈다면, 그 데이터는 확실히 디스크에 저장된 것입니다.
- 시나리오:
- 쇼핑몰에서 "결제" 버튼을 눌렀고, "주문 완료" 창이 떴습니다.
- 0.1초 뒤에 서버실 전원이 나갔습니다.
- 지속성이 있다면: 서버를 켜면 주문 내역은 그대로 남아있습니다.
- 기술적 원리:
- 데이터베이스는 WAL(Write-Ahead Log) 을 사용합니다.
- 복잡한 데이터 파일에 실제로 쓰기 전에(이건 느림), 변경 내용을 아주 단순한 로그 파일에 먼저 빠르게 씁니다(Append Only).
- 이 로그가 디스크에 확실히 기록(
fsync)된 후에야 "성공" 신호를 보냅니다.
references