이번 포스팅의 주제는 ACID, Atomicity, Consistency, Isolation, Durability 에 대해 다뤄 보도록 하겠다.
데이터베이스 내에서 일어나는 트랜잭션의 안전성을 보장하기 위해 필요한 성질이다.
특히 돈이 오가는 주식, 금융업계에서 이러한 성질이 보장되지 않는다면 심각한 금융 사고로 이어질 수 있다.
ACID는 데이터베이스에서 데이터를 처리할 때 발생할 수 있는 예외적인 상황을 줄이고, 데이터베이스의 무결성을 보호할 수 있다.
원자성이라고 부르는 성질이다. 트랜잭션과 관련 된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 성질이다.
하나의 트랜잭션에서 중간에 특정한 작업이 실패한다면, 그 트랜잭션은 유효라고 할 수 없다.
예를 들어 A가 B에게 송금을 한다면, A의 계좌에서 돈이 빠져나가고 B의 계좌에 돈이 들어가게 된다. 만약에 A의 계좌에서 돈이 빠져나갔음에도 불구하고 B의 계좌에 돈이 들어가지 않는다면? 심각한 에러이므로 트랜잭션이 성립하지 않아 거래는 취소된다.
일관성이라고 부르는 성질이다. 트랜잭션이 성공적으로 끝난다면, 일관성 있는 DB상태로 유지해야 한다는 것을 의미한다.
즉 무결성 제약 조건에 위배되는 트랜잭션이 실행되는 것을 막기 위해 필요한 성질이다.
만약 계좌에 돈이 없는 상황에서 송금 트랜잭션을 처리하려고 했을 때, 계좌에 만약 잔고가 있어야 한다는 게 무결성 제약 조건이라면 해당 트랜잭션은 중단 되게 된다.
독립성이라고 부르는 속성이다. 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못 하도록 하는 속성이다. 트랜잭션 외부의 연산은 중간 단계의 데이터를 절대 알 수 없다.
사실 이해하기 가장 어려운 속성인데, 간단히 얘기하면 트랜잭션이 1, 2, 3, 4가 거의 동시에 수행 되더라도 순서대로 수행 한 것 마냥 실행해야 한다는 것이다.
조금 더 알기 쉬운 예시를 들어보자면 현재 내 계좌에 돈이 만원이 있다. 이 상황에서 A, B 계좌에 각각 6천원을 이체하는 트랜잭션이 실행된다면, A에 먼저 송금한 후 B 계좌에 송금 한 결과와 동일해야 한다는 것이다.
각각의 트랜잭션은 다른 트랜잭션에 전혀 관여할 수 없는 독립적인 상태다. 즉 B 계좌에 송금하는 트랜잭션은 A 계좌에 대한 트랜잭션에 관여 할 수 없다. 또한 작업 내용또한 알 수 없다.
마치 연속적으로 실행 된 것 과 같은 상태가 유지 되어야 한다.
지속성이라고 부르는 속성이다. 성공적으로 수행 된 트랜잭션은 영원히 반영되어야 한다는 의미다. 모든 트랜잭션은 로그로 남고, 시스템 장애가 발생할 시 로그를 추적하여 전 단계로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에 commit 상태로 간주 될 수 있다.
여러 트랜잭션이 들어오게 된다면 Concurrency(동시성)이라는 성질이 생긴다. 거의 동시에 많은 요청들이 들어오게 되는 경우가 반드시 있기 마련이다. 이런 상황에서 ACID 를 보장하기 위해서 필요한 기술이 Concurrency Control이다.
Concurrency Control은 다수의 사용자 사이에 동시에 작용하는 다중 트랜잭션의 상호 간섭 작용에서 DB를 보호하는 것을 의미한다.
Concurrency를 허용하게 된다면 Consistency가 낮아지게 된다. 너무나 많은 상호 간섭이 일어나게 될 테니까.
대표적인 Concurrency Control 기법으로 Lock 과 MVCC가 있다.
ACID를 보장하기 위해 어떠한 트랜잭션이 실행될 때 DB를 잠궈버리는 것을 의미한다.
상당히 극단적인 방법이다. 만약 수 많은 사용자들이 동 시간대에 요청한다면 계속해서 응답을 기다리다 지치는 경우가 생길 수 있다.
두 가지 방법이 있다.
Lock의 대안. Multi Version Concurrency Control의 약자. 다중 버전 동시성 제어라고도 부른다.
메커니즘은 다음과 같다.
MVCC를 사용하게 되면 사용하지 않는 데이터가 생기므로 데이터를 정리하는 시스템이 필요하다. 또한 데이터 버전이 충돌하는 경우가 생긴다면 애플리케이션 영역에서 이 문제를 해결해야 한다.
Oracle, MySQL등 주로 쓰이는 RDBMS에서 해당 기능을 지원하고 있다.
이번 포스팅에서는 ACID 뿐만 아니라 이러한 성질을 유지하기 위해 필요한 기술들 까지 함께 알아보았다.
다음 포스팅에서는 트랜잭션에 대해 깊게 포스팅 해 보도록 하겠다.
https://ko.wikipedia.org/wiki/ACID
https://ko.wikipedia.org/wiki/%EB%8F%99%EC%8B%9C%EC%84%B1_%EC%A0%9C%EC%96%B4