모든 이야기

데이터베이스의 네 가지 약속을 구분하는 ACID

ACID는 트랜잭션이 제공하는 대표적인 네 속성인 원자성, 일관성, 격리성, 지속성을 묶은 이름이다. 네 단어가 모두 안전하다는 막연한 뜻을 반복하는 것은 아니다. 각각 서로 다른 실패와 관찰 조건을 다루며, 실제 보장의 강도는 시스템 설정과 응용의 규칙에 연결된다.

원자성·일관성·격리성·지속성을 각각 변경 묶음, 제약 검사, 동시 실행, 재시작 뒤 보존으로 표현한 그림

ACID의 네 속성은 서로 다른 실패와 관찰 조건을 다룬다.

변경을 묶고 유효한 상태를 지킨다

원자성은 트랜잭션의 효과가 전부 반영되거나 전부 취소되어야 한다는 속성이다. 계좌 이체에서 출금만 남고 입금은 사라진 상태를 성공 결과로 인정하지 않는다. 원자성이 있다는 말은 CPU가 여러 문장을 물리적으로 같은 순간에 실행한다는 뜻이 아니다. 중간에는 여러 단계가 있지만 실패 시 전체 효과를 관리한다.

일관성은 유효한 상태에서 시작한 올바른 트랜잭션이 정해진 무결성 규칙을 지키는 상태로 끝난다는 관점이다. 잔액 제약, 유일성, 참조 무결성 등이 관련된다. 그러나 DBMS가 모든 업무 규칙을 저절로 아는 것은 아니다. 개발자가 잘못된 금액을 계산해도 형식적 제약을 만족할 수 있으므로 응용과 제약 정의의 책임이 남는다.

동시에 일어나도 허용된 결과만 남긴다

격리성은 동시에 실행되는 트랜잭션들이 서로의 중간 작업을 어떻게 관찰하고 영향을 주는지에 관한 속성이다. 가장 강한 대표적인 기준은 어떤 직렬 실행과 같은 결과를 갖는 직렬 가능성이다. 제품이 ACID를 지원한다고 해서 모든 연결이 항상 그 수준을 기본으로 사용하는 것은 아니다.

낮은 격리 수준은 일부 이상 현상을 허용하면서 동시성을 높일 수 있다. 읽은 값을 바탕으로 나중에 쓰는 작업은 다른 트랜잭션과 충돌할 가능성이 있다. 필요한 규칙이 한 행인지 여러 행에 걸쳐 있는지에 따라 적절한 격리와 잠금, 제약을 선택해야 한다. 속성 이름만 보고 업무가 안전하다고 결론 내리면 안 된다.

지속성은 성공적으로 커밋한 결과가 정해진 장애 범위 안에서 보존된다는 속성이다. 데이터를 메모리에서 바꾼 사실과 영속 저장장치에 안전하게 반영한 사실은 다르다. 로그와 동기화, 저장장치의 동작 등으로 커밋 후 복구를 지원한다. 성능을 위해 동기화를 줄이는 옵션을 선택하면 해당 보장과 위험 범위도 달라질 수 있다.

네 속성으로 실패를 분류해 본다

이체 중 오류가 나서 출금만 남는 문제는 원자성에 연결된다. 없는 계좌에 입금 기록을 남기는 것은 무결성 규칙과 일관성의 문제다. 두 사용자의 동시 수정으로 예상하지 못한 결과가 나오는 것은 격리를 살펴볼 이유다. 커밋한 기록이 재시작 후 사라지는 것은 지속성의 조건을 확인해야 한다.

이 분류는 각 실패가 정확히 하나의 속성에만 관계된다는 뜻은 아니다. 현실의 구현에서는 로그, 동시성 제어와 제약 검사가 함께 작동한다. 또한 ACID의 일관성과 복제 시스템의 최신 읽기 보장인 일관성 모델은 같은 단어를 써도 다른 질문을 다룬다. 하나가 있다고 다른 하나의 모든 보장이 생기지 않는다.

지속성은 백업의 대체물이 아니다. 정상적으로 커밋된 잘못된 삭제도 지속성의 관점에서는 잘 보존된 결과다. 저장장치 전체 상실이나 운영자의 오류에 대비하려면 장애 모델에 맞는 복제와 백업, 복구 정책이 필요하다. DB 안의 트랜잭션이 외부 메일 발송까지 원자적으로 묶는지도 별도로 확인해야 한다.

ACID를 실제로 평가하려면 커밋 응답이 언제 나오는지, 어떤 격리 수준을 사용하는지, 어떤 제약을 선언했는지와 어떤 장애를 복구할 수 있는지 적어야 한다. 네 글자는 제품의 성능 등급보다 검토해야 할 약속의 목록이다. 각 약속의 범위와 책임을 분리하면 속성 이름을 업무의 정확한 요구사항으로 바꿀 수 있다.

참고 자료

데이터베이스의 네 가지 약속을 구분하는 ACID · ariser