cleanUrl: /posts/what-is-acid-about-transaction
share: true

DB의 Transaction 에 대해 다루다 보면 정말 많이 듣는 용어가 ACID 이다. 트랜잭션 이라는 단어 자체가 매우 모호 하지만, ACID 에서 특히 C 만큼은 정말 모호하다. 그래서 한번 정확히 정리하고 넘어가야겠다는 생각이 들어 더 이상 다시 확인하지 않고, 이 글을 읽는 사람들도 확실히 정리되어 다시 확인하지 않았으면 한다.

Transaction

쇼핑몰에서 카드 결제를 완료하고, 그 이후 어딘가에서 에러가 났다. 그때 결제가 되지 않고, 재고에도 변화가 없도록 DB에 필요한 처리 라는 설명을 듣고 트랜잭션이 무엇인지, 왜 필요한 것인지 한번에 이해가 되었다.

하지만, 트랜잭션 이라는 단어는 매우 모호하다. 일부 비관계형, 관계형에서 트랜잭션을 따른다고 하지만 이 들은 1975년 IBM 의 R시스템에서 소개된 스타일을 따르고 그 개념이 지금까지 사용되는데 조심스러운 추측이지만, 마케팅적인 용어가 아닌가 싶다.

Transaction 을 좀더 엔지니어적으로 표현하자면 "읽기와 쓰기를 하나의 논리적 단위로 묶는 방법" 이라고 정의할 수 있다.

그리고, 묶여진 단위는 commit 되거나 rollback 이라는 기능이 보장되어야 한다.

ACID

트랜잭션이 제공하는 안전성 보장은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability) 를 의미하는 ACID 로 알려져 있다.

그러나 실제로 DB 회사 마다 그 정의가 조금씩 다르며, 그래서 무엇을 보장하는지 역시 직접 살펴봐야 한다. 우리에게 중요한 것은 전체적인 흐름보다도 때론 매우 작은 detail 상황 때문이다.

이러한 ACID 표준을 따르지 않는 시스템을 BASE 라고 부르며, 다음의 특징을 따른다

ACID 보다 더 애매하다.

원자성: Atomicity

일반적으로 원자적 이라 하면, 더 쪼갤 수 없는 뭔가를 의미하며, 대표적으로 Multi Thread 가 원자적인 연산을 실행할 때 다른 thread 에서 절반만 완료된 연산을 관찰할 수 없는, 그래서 실행 의 상태만 존재하는 경우를 의미한다.

하지만, Transaction 에서 원자성은 이와 연관이 없다(오히려 Isolation 에 가깝다)

ACID 에서 원자성이라 하면, client 가 쓰기 몇 개의 작업을 수행하고자 할 때, 그중 일부만 처리된 후 결함이 발생하여(예를 들어 process 가 죽거나, network 연결이 끊어지거나, 디스크에 문제가 발생하거나, 정합성 조건을 위반하거나 등등) commit 해서 안되는 상황이면 abort (DB는 지금까지 쓴 작업을 무시하거나 취소해야 한다) 하는 작업을 Atomicity 라 한다.