DB

Mysql ACID 란?

Lee_SJ 2025. 2. 16. 19:36

1. ACID란 무엇인가?

ACID는 데이터베이스 트랜잭션의 4가지 필수 속성으로, 안정성과 신뢰성을 보장하는 개념입니다.

✅ ACID 4가지 속성

속성 설명 예시
Atomicity (원자성) 트랜잭션은 모두 반영되거나, 전혀 반영되지 않아야 함 송금 중 오류 발생 시, 돈이 빠져나가거나 들어오지 않도록 보장
Consistency (일관성) 데이터베이스의 일관성이 유지되어야 함 계좌 이체 후에도 총 금액이 변하지 않아야 함
Isolation (고립성) 여러 트랜잭션이 서로 영향을 주지 않아야 함 동시에 같은 계좌에서 출금해도 한 번만 출금됨
Durability (지속성) 트랜잭션이 완료되면 데이터가 영구적으로 저장 시스템이 다운되어도 커밋된 데이터는 유지됨

2. MySQL이 ACID를 보장하는 방식

MySQL은 InnoDB 스토리지 엔진을 사용하여 ACID를 보장합니다.
MySQL이 ACID를 보장하는 주요 자료구조와 알고리즘을 살펴보겠습니다.

3. Atomicity (원자성) – 트랜잭션 로그 (Redo/Undo Log)

💡 트랜잭션은 부분적으로 실행되지 않으며, 모두 실행되거나 아무것도 실행되지 않아야 함.

✅ MySQL의 원자성 보장 방식

  • MySQL은 Undo Log(롤백 로그) 를 사용하여 원자성을 유지합니다.
  • 만약 트랜잭션이 실패하면 Undo Log를 통해 이전 상태로 되돌림(Rollback).

📌 자료구조 & 알고리즘

자료구조 설명
Undo Log (로그 파일) 변경 전 데이터를 기록하여 롤백 가능하도록 함
Write-Ahead Logging (WAL) 트랜잭션 로그를 먼저 기록 후 실제 데이터 변경

 

📌 트랜잭션 실행 예시

START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 모든 작업이 완료되면 반영

 

중간에 장애 발생 시 → Undo Log를 사용하여 롤백!

 

4. Consistency (일관성) – 데이터 무결성 제약조건

💡 트랜잭션 수행 전후 데이터베이스의 상태가 유지되어야 함.

✅ MySQL의 일관성 보장 방식

  1. 무결성 제약조건 (Integrity Constraints)
    • PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE 등을 이용하여 데이터의 일관성 유지.
  2. 트랜잭션 일관성
    • 트랜잭션이 실행되기 전과 후의 데이터 상태를 보장.

📌 자료구조 & 알고리즘

자료구조 설명
B+ Tree (인덱스 구조) 데이터 정합성을 유지하며 빠르게 조회 가능
Foreign Key (외래키 무결성 제약) 부모-자식 관계를 유지하여 데이터 정합성 보장

 

📌 외래키 제약 조건 예시

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

사용자가 삭제되면 연결된 orders 데이터도 자동으로 삭제됨 → 데이터 일관성 유지.

 

5. Isolation (고립성) – 트랜잭션 격리 수준 (Isolation Levels)

💡 각 트랜잭션이 독립적으로 실행되어야 함.

✅ MySQL의 고립성 보장 방식

MySQL은 4가지 트랜잭션 격리 수준(Isolation Level) 을 지원합니다.

  • READ UNCOMMITTED: 다른 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있음 (Dirty Read 발생).
  • READ COMMITTED: 커밋된 데이터만 읽을 수 있음 (Non-Repeatable Read 발생 가능).
  • REPEATABLE READ (기본값): 같은 트랜잭션에서 동일한 데이터를 여러 번 읽어도 변하지 않음 (Phantom Read 발생 가능).
  • SERIALIZABLE: 가장 엄격한 격리 수준, 트랜잭션을 순차적으로 실행.

📌 자료구조 & 알고리즘

자료구조 설명
MVCC (Multi-Version Concurrency Control) 트랜잭션 간 충돌을 줄이고, 과거 데이터를 관리
Row-Level Locking (행 단위 잠금) 특정 행만 잠가 동시성 문제 해결
Gap Lock (갭 락) REPEATABLE READ에서 팬텀 리드 방지

 

6. Durability (지속성) – Redo Log & Checkpointing

💡 트랜잭션이 성공적으로 완료되면 데이터는 영구적으로 저장됨.

✅ MySQL의 지속성 보장 방식

  • Redo Log (재실행 로그) 를 사용하여, 트랜잭션이 커밋된 후에도 데이터를 복구 가능.
  • Checkpoint(체크포인트)를 생성하여, Redo Log를 주기적으로 디스크에 기록.

📌 자료구조 & 알고리즘

자료구조 설명
Redo Log (재실행 로그) 디스크에 데이터가 저장되기 전, 변경 사항을 기록하여 복구 가능
Double Write Buffer (이중 기록 버퍼) 데이터 손실 방지를 위해 한 번 더 기록
Checkpoint (체크포인트) 주기적으로 디스크에 저장하여 Redo Log 크기 최소화

 

📌 Redo Log 동작 예시

START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
COMMIT; -- Redo Log에 기록 후 디스크 반영

만약 서버가 다운 되어도 Redo Log를 이용해 데이터 복구 가능!

 

7. 결론: MySQL의 ACID 보장 방식 요약

ACID 속성 MySQL 보장 방식 자료구조 & 알고리즘
Atomicity (원자성) 트랜잭션 실패 시 롤백 Undo Log, WAL
Consistency (일관성) 무결성 제약 유지 B+ Tree, Foreign Key
Isolation (고립성) 트랜잭션 격리 수준 제공 MVCC, Row Locking, Gap Lock
Durability (지속성) 트랜잭션 커밋 후 영구 저장 Redo Log, Checkpoint