개념 노트
ACID와 InnoDB
트랜잭션의 ACID(Atomicity, Consistency, Isolation, Durability) 속성과 MySQL의 기본 스토리지 엔진인 InnoDB. 인덱스 구조(트리와 인덱스 (Tree & Index))와 함께 DB 내부 동작을 이해하는 축.
ACID 네 가지 속성
Atomicity(원자성)는 트랜잭션이 전부 반영되거나 전부 취소되는 성질이다. 계좌 이체에서 출금만 되고 입금이 안 되는 중간 상태를 남기지 않는다. Consistency(일관성)는 트랜잭션 전후로 제약 조건(외래 키, unique, 잔액 ≥ 0 같은 규칙)이 깨지지 않는 성질이다. Isolation(격리성)은 동시에 실행되는 트랜잭션들이 서로의 중간 상태를 보지 못하게 하는 성질이고, Durability(지속성)는 커밋된 결과가 장애(전원 차단 등) 후에도 살아남는 성질이다.
InnoDB가 ACID를 구현하는 방식
InnoDB는 MySQL의 기본 스토리지 엔진으로, 트랜잭션과 ACID를 지원한다는 점이 핵심 정체성이다(구형 엔진 MyISAM은 트랜잭션을 지원하지 않는다).
- 원자성: undo log. 변경 전 값을 기록해 두었다가 롤백 시 되돌린다.
- 지속성: redo log(WAL, Write-Ahead Logging). 데이터 페이지를 디스크에 쓰기 전에 변경 내역을 로그에 먼저 기록해, 장애 후 재시작 시 커밋된 변경을 재적용한다.
- 격리성: 잠금(lock)과 MVCC. MVCC는 undo log의 이전 버전을 이용해 읽기 트랜잭션이 잠금 없이 일관된 스냅샷을 읽게 한다. 격리 수준은 READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ(InnoDB 기본값) → SERIALIZABLE 순으로 강해진다.
- 일관성: 별도 장치가 있다기보다 위 셋과 제약 조건 검사가 지켜질 때 따라오는 결과 속성이다.
클러스터드 인덱스 — tree-index와의 연결
InnoDB 테이블 자체가 PK 기준 B+ tree다(clustered index). 리프 노드에 행 데이터 전체가 들어 있어, PK 조회는 트리 탐색 한 번으로 끝난다. 세컨더리 인덱스의 리프에는 행 위치가 아니라 PK 값이 들어 있어, 세컨더리 인덱스로 찾으면 그 PK로 클러스터드 인덱스를 한 번 더 타야 한다. 인덱스 구조가 곧 저장 구조인 셈이라 트리와 인덱스 (Tree & Index)의 B+ tree 이해가 그대로 InnoDB 이해로 이어진다.
자주 혼동하는 포인트
- Consistency는 "데이터가 항상 맞다"는 막연한 말이 아니라 "정의된 제약을 트랜잭션 단위로 보존한다"는 뜻이며, 나머지 세 속성이 지켜져야 성립하는 결과에 가깝다.
- redo와 undo의 방향: redo는 장애 후 커밋된 것을 다시 적용(roll forward), undo는 롤백과 MVCC용 이전 버전 보관(roll back)이다.
- InnoDB는 DB가 아니라 MySQL의 스토리지 엔진이다. 같은 MySQL이라도 엔진에 따라 트랜잭션 지원 여부가 달라진다.
관련 문서
- 노트: 학습 로그
- 관련 토픽: 트리와 인덱스 (Tree & Index)