DataBase/이론&SQL

[데이터베이스]트랜잭션 ACID 속성

DevStory 2021. 11. 28.

트랜잭션이란?

데이터베이스는 단순히 조직화된 데이터의 집합입니다. 예를 들어 성적, 계좌 정보, 급여 명세서 등을 예시로 설명할 수 있습니다.

 

위에서 설명한 정보들(성적, 계좌 정보, 급여 명세서 등...)은 비즈니스에 맞게 조직적이고 일관된 방식으로 데이터를 관리합니다.

 

여기서 말하는 비즈니스에 대해 설명드리자면, 대한민국에는 여러 개의 은행사가 존재합니다. 신한은행, 국민은행, 부산은행 등 수많은 은행이 존재하지만, 은행별로 계좌를 관리하는 로직 또는 테이블의 구조가 은행마다 다를 수 있습니다. 즉, 은행마다 데이터를 관리하는 로직 또는 체계를 비즈니스라고 할 수 있습니다.

 

앞서 언급한 정보들은 중요한 정보(=데이터)가 포함되어 있습니다. 중요한 정보가 일관성이 없거나 신뢰할 수 없다면, 사용자에게는 잘못된 정보를 제공하고 잘못된 정보를 제공한 기업 또는 학교에는 여러가지 문제 또는 불이익을 받는 문제가 발생합니다.

 

트랜잭션은 데이터베이스의 작업을 처리하는 단위입니다. 애플리케이션 또는 프로그램이 데이터베이스의 데이터를 읽기, 쓰기를 논리적 단위로 그룹화하는 방법이며, 트랜잭션은 정상적으로 성공(Commit)하거나 실패(Rollback)됩니다.

 

트랜잭션의 간단한 예는 계좌이체입니다. 사용자 A의 계좌에서 사용자 B로 금액을 전송합니다. 금액은 아주 중요한 정보로써 안정성과 일관성을 보장해야합니다.

 

예시에서 언급한 사용자 A의 계좌의 금액을 사용자 B에게 전송하는 작업은 데이터베이스의 작업인 트랜잭션이며, 트랜잭션이 정상적으로 처리되기 위해서는 트랜잭션의 특성인 ACID를 충족해야합니다.


원자성(Atomicity)

원자성은 데이터베이스 트랜잭션의 All 또는 Nothing을 의미합니다. 데이터베이스의 연산이 전부 실행되거나 또는 전혀 실행되지 않아야 합니다.

 

계좌 이체는 트랜잭션의 원자성을 설명해주는 좋은 예시입니다. 사용자 A의 계좌에서 돈을 사용자 B에게 이체하는 경우 이체가 되거나 이체되지 않아야 합니다. 이체하는 과정에서 전산 오류가 발생하여 데이터베이스에서 사용자 A의 돈을 사용자 B에게 전송하지 못하면, 원래 초기 상태(이체하기 이전 상태)로 돌아갑니다.


일관성(Consistency)

일관성이란 트랜잭션이 데이터 무결성에 대한 제약 조건과 호환되어야 함을 의미합니다. 즉, 데이터는 모순이 없어야 합니다. 트랜잭션이 제약 조건을 위반하는 경우 일관성을 통해 트랜잭션이 실행되지 않고 이전의 상태로 돌아갑니다.

 

내 계좌가 마이너스 잔액을 허용하지 않는다고 가정합니다. 여기서 제약 조건은 "마이너스 잔액을 허용하지 않음"입니다. 즉, 잔액은 0원 미만이 될 수 없습니다. 내 계좌에 100만원이 있고 200만원의 제품을 구매하려고 합니다.

 

마이너스 잔액을 허용한다면 제품을 구매할 수 있지만, 내 계좌는 제약 조건이 존재하므로 구매하는 작업은 거부됩니다.


고립성(Isolation)

고립성은 동시 트랜잭션을 처리하는데 사용됩니다. 데이터는 매우 빠른 속도로 처리되므로 사용자 입장에서는 잘 모르지만, 여러 사용자가 동시에 동일한 테이블을 쓰거나 읽는 트랜잭션이 발생할 수 있습니다.

 

동일한 테이블의 데이터를 수정하는 두 개의 트랜잭션이 동시에 발생하면 문제가 발생할 수 있습니다. 고립성은 이렇나 트랜잭션이 "직렬화"되도록 하여 다른 트랜잭션이 하나의 트랜잭션이 완료될 때까지 대기함을 의미합니다.

 

여기서 말하는 "직렬화"는 동시에 접근했지만, 순차적으로 처리하는 과정을 말합니다.

 

두 고객이 전자 상거래 웹사이트(위메프, 11번가, 옥션 등...)에서 제품을 동시에 구매하려고 하는데 재고가 하나 남아 있다고 가정합니다. 데이터베이스가 두 고객이 동시에 제품을 구매할 수 있도록 허용하면 문제가 발생합니다.

 

고립성은 이러한 경우를 순서대로 배치하여 다른 작업을 시작하려면 작업 중 하나를 완료해야 합니다.

 

즉, 동시에 구매 요청을 했지만, 트랜잭션을 순차적으로 처리하였기 때문에 한 명은 구매가 성공하였으며, 구매하는 과정에서 재고가 0개가 되었으므로 남은 한 명은 제품 구매가 되지 않습니다.


지속성(Durability)

지속성은 트랜잭션이 완료되면 이 트랜잭션으로 인한 결과는 영구적임을 보장합니다. 트랜잭션이 정상적으로 완료되었으므로 정전과 같은 시스템 장애의 영향을 받지 않습니다.

 

만약, 트랜잭션 실행 도중에 정전이 발생했으면, 원자성에 의해 트랜잭션이 실패(Rollback)되어야 합니다.

 

완료된 트랜잭션은 비휘발성 메모리에 저장됩니다.

 

내 계좌에서 100만원이 있고 50만원을 다른 계좌로 이체한다고 가정해보겠습니다. 이체가 정상적으로 되었으면, 내 계좌는 50만원으로 줄어듭니다. 잔액을 다시 확인해봤는데, 100만원이 있는 경우 이것은 이체하는 과정의 문제이며, 지속성은 이러한 문제가 발생하지 않음을 보장합니다.

반응형

댓글