DB

[Database/DBMS] 트랜잭션과 ACID

ayeongjin 2025. 10. 11. 13:32

트랜잭션이란?

데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위

트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업시 처리되는 작업의 논리적 단위로 사용된다. 사용자가 시스템에 대한 요구시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위로 사용된다.

 

쉽게 말해, 여러 개의 SQL 연산을 하나의 묶음으로 처리하는 것이다.

예를 들어 은행에서 계좌 이체를 한다면,

  1. A 계좌에서 돈을 빼고
  2. B 계좌로 돈을 넣는

이 두 작업이 모두 성공해야 이체가 완료되고, 이 중 하나라도 실패하면 전체가 취소되어야한다.

이 전체 과정을 트랜잭션이라고 부르고, 데이터베이스가 신뢰할 수 있는 상태를 유지하도록 돕는다.

 

트랜잭션 모델은 데이터베이스의 종류에 따라 크게 두 가지로 나뉜다.

  1. ACID: 관계형 DBMS에서 사용하는 강한 일관성 모델
  2. BASE: NoSQL 등 분산 시스템에서 사용하는 느슨한 일관성 모델

 

ACID와 BASE가 중요한 이유

현대적 데이터베이스는 단일 서버가 아닌, 여러 노드에 데이터를 분산 저장하는 형태로 운영된다. 이때 사용자는 하나의 트랜잭션에서 여러 노드의 데이터를 동시에 읽고 쓰기도 한다.

이렇게 서버가 여러 대일 때, 모든 데이터가 완벽히 동일한 시점에 업데이트 되기는 어렵다. 그래서 Brewer의 CAP 이론에 따라 어떤 속성을 우선시할지 선택해야 한다.

 

  1. 일관성 (Consistency): 모든 읽기 작업에서 가장 최근에 업데이트된 데이터 또는 오류를 수신한다.
  2. 가용성 (Availability): 모든 데이터베이스 요청에서 가장 최근에 업데이트된 데이터가 포함되어 있는지 확인하지 않고도 성공 응답을 수신한다.
  3. 파티션 내성 (Partition Tolerance): 분산 노드 간에 메세지가 삭제되거나 지연되더라도 시스템이 계속 작동한다.

CAP 정리에 따르면, 세 가지를 동시에 만족시키는 시스템은 존재하지 않는다. 따라서 시스템 설계자는 일관성과 가용성 중 하나를 우선시해야한다.

 

예를 들어, 고객이 전자 상거래 웹 사이트에서 카트 품목을 추가한 경우, 다른 모든 고객은 해당 제품의 재고가 줄어드는 것을 확인할 수 있다. 고객이 카트에 해당 품목의 마지막 남은 하나를 추가한 경우 다른 모든 사용자에게는 해당 품목이 품절된 것으로 표시된다.

 

데이터베이스 설계자는 트랜잭션 내에서 작업이 실패할 경우 어떻게 할지 선택해야 한다. 데이터베이스는 다음 중 하나를 수행할 수 있다.

  1. 트랜잭션을 취소하고 오류를 반환하면 가용성을 떨어지지만 일관성은 보장된다. 카트에 추가하기가 성공할 때까지 고객이 카트 품목을 추가할 수 없거나 다른 고객이 모든 제품에 대한 세부 정보를 로드할 수 없다.
  2. 작업을 계속 진행하면 가용성이 제공되지만 불일치가 발생할 수 있다. 고객이 카트에 품목을 추가했지만 다른 고객에게는 적어도 일시적으로 잘못된 재고 수준이 표시된다.

 

일부 사용 사례에서는 일관성이 중요하여 ACID 데이터베이스가 선호된다.

하지만 일관성이 중요하지 않은 사용 사례도 있다. 예를 들어, 소셜 미디어에서 친구 요청을 수락할 때 일기적으로 소셜 미디어 프로필에 다른 사용자의 친구 수가 잘못 표시되어도 상관없다. 하지만 데이터가 업데이트 되는 동안 소셜 미디어 피드에 액세스하지 못하게 되어서는 안 된다. 이런 시나리오에서는 BASE가 중요해진다.

 

 

ACID

ACID 데이터베이스는 가용성보다 일관성을 우선시한다. 따라서 트랜잭션의 어느 단계에서든 오류가 발생하면 전체 트랜잭션이 실패한다.

 

ACID는 크게 4가지로 구분되며, 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 의미한다.

  • 원자성 (Atomicity)
  • 일관성 (Consistency)
  • 고립성 (Isolation)
  • 지속성 (Durability)

 

원자성 (Atomicity)

원자성은 트랜잭션 내부 연산들이 부분적으로 실행되고 중단되지 않는 것을 보장한다.

쉽게 말하면, 트랜잭션은 전체 성공과 전체 실패 중 한 가지만 수행한다.

예를 들면 계좌 이체 트랜잭션은 다음과 같은 연산으로 이루어져 있다. 이때, 2번 과정에서 에러가 발생하면 1번 과정을 취소해야한다.

1. A계좌에 3000원 출금
2. B계좌에 3000원 입금

 

일관성 (Consistency)

일관성은 트랜잭션이 성공적으로 완료되면 일관성 있는 데이터베이스 상태로 유지되는 것을 보장한다.

예를 들어 제약 조건과 같이 데이터베이스에 정의된 규칙을 트랜잭션이 위반하는 경우에는 해당 트랜잭션은 취소되어야 한다.

 

고립성 (Isolation)

고립성은 동시에 실행되는 여러 트랜잭션이 서로 독립적임을 보장한다.

가장 엄격할 경우에는 트랜잭션을 순차적으로 실행하기도 한다. 트랜잭션을 수행할 때 다른 트랜잭션이 해당 작업 사이에 끼어들지 못하도록 보장한다.

쉽게 말하면 트랜잭션 밖에서 어떠한 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다.

예를 들어, 계좌 이체 작업에서 A계좌의 잔고와 B계좌의 잔고 총합이 10,000원인 상태로 시작했을 때, 특정 순간에는 총합이 10,000원이 아닌 경우도 있을 것이다. 하지만 다른 트랜잭션은 항상 잔고의 총합인 10,000원을 볼 수 있도록 보장되어야 한다.

 

지속성 (Durability)

지속성은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 보장한다.

시스템에 장애가 발생해도 성공적으로 수행된 트랜잭션의 결과를 항상 데이터베이스에 반영되어 있어야 한다. 전형적으로 트랜잭션은 로그로 남고, 로그가 저장되어야 트랜잭션이 성공했다고 간주한다. 추후 장애가 발생한다면 이 로그를 활용해 데이터베이스를 회복한다.

 

트랜잭션의 Commit, Rollback 연산

 

Commit이란 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태에 있을 때, 하나의 트랜잭션이 끝났다라는 것을 알려주기 위해 사용하는 연산이다.

 

이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장되고, 후에 Rollback 연산을 구생했었던 트랜잭션 단위로 하는 것을 도와준다.

Rollback이란 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다.

후에 사용자가 트랜잭션 처리된 단위대로 Rollback을 진행할 수도 있다.

 

MySQL에서 트랜잭션 수행 예시

START TRANSACTION;
UPDATE account SET balance = balance - 200000 WHERE id = 'J';
UPDATE account SET balance = balance + 200000 WHERE id = 'K';
COMMIT; -- 성공 시
-- 혹은
ROLLBACK; -- 실패 시 전체 취소

 

 

BASE

BASE 데이터베이스는 일관성보다 가용성을 우선시한다. 트랜잭션이 실패하는 것이 아니라, 사용자가 일관되지 않은 데이터에 일시적으로 액세스 하게 된다. 데이터 일관성은 달성되지만, 즉시 달성되지는 않는다.

 

BASE 약어는 화학 물질과 마찬가지로, BASE가 ACID와 반대되는 개념임을 강조한다.

  • 기본 가용성 (Basically Available)
  • 소프트 상태 (Soft state)
  • 최종 일관성 (Eventually consistent)

 

기본 가용성 (Basically Available)

기본 가용성이란 사용자가 언제든 데이터베이스에 동시에 액세스할 수 있음을 의미한다.

사용자가 레코드를 업데이트하기 위해 다른 사용자가 거래를 완료할 때까지 기다릴 필요가 없다.

예를 들어, 전자 상거래 플랫폼에서 트래픽이 갑자기 급증하는 경우, 시스템은 제품 목록 제공 및 주문 수락을 우선시할 수 있다. 재고 수량 업데이트가 약간 지연되더라도 사용자는 계속해서 항목을 체크아웃할 수 있다.

 

소프트 상태 (Soft state)

소프트 상태란 외부 트리거 또는 입력이 없더라도, 데이터가 시간 경과에 따라 변할 수 있는 일시적 상태 또는 임시 상태를 가질 수 있다는 개념이다.

여러 애플리케이션이 동시에 레코드를 업데이트할 때의 레코드의 전환 상태를 설명한다. 레코드 값은 모든 트랜잭션이 완료된 후에만 최종적으로 확정된다.

예를 들어, 사용자가 소셜 미디어 게시물을 편집하는 경우, 변경 사항이 다른 사용자에게 즉시 표시되지 않을 숟 있다. 하지만 나중에 사용자가 트리거하지 않았더라도 게시물이 저절로 업데이트 된다. (이전 변경 사항 반영)

 

최종 일관성 (Eventually consistent)

최종 일관성은 모든 동시 업데이트가 완료되었을 때 레코드의 일관성이 유지된다는 것을 의미한다.

이 시점에 레코드르 쿼리하는 애플리케이션은 동일한 값을 얻게 된다.

예를 들어, 여러 사용자가 동시에 문서를 편집할 수 있는 분산 문서 편집 시스템에서, 변경 내용이 전파되고 동기화 될 때까지 로컬 사본이 일시적으로 서로 달라질 수 있다. 하지만 시간이 지남에 따라 시스템은 여러 사용자가 변경한 내용을 전파하고 병합하여 최종 일관성을 보장한다.

 

 

ACID와 BASE 비교

ACID 및 BASE 데이터베이스 트랜잭션 모델 중 하나를 선택할 때는 몇 가지 절충점을 고려해야 한다.

 

규모 조정

ACID 데이터베이스 트랜잭션 모델은 일관성에 초점을 맞추기 때문에 규모를 조정하기가 더 어렵다. 어떤 레코드든 항상 하나의 트랜잭션만 허용되므로 수평적 규모 조정이 더 어렵다.

BASE 데이터베이스 모델의 경우 엄격한 일관성을 유지할 필요가 없으므로, 수평적으로 규모를 조정할 수 있다. 데이터베이스 클러스터에 여러 노드를 추가하면 BASE 모델이 데이터베이스 아키텍처를 구동하는 원칙인 데이터 가용성을 개선할 수 있다.

 

유연성

ACID 데이터베이스는 데이터를 처리할 때 유연성이 떨어진다. 즉각적인 일관성을 보장해야 하며, 네트워크나 정전이 발생할 경우 일부 애플리케이션에 대한 액세스가 제한될 수 있다. 마찬가지로, 다른 소프트웨어 모듈에서 특정 레코드를 처리 중인 경우 애플리케이션이 데이터를 업데이트할 차례를 기다려야 한다.

반면, BASE 데이터베이스는 보다 유연하다. BASE는 엄격한 제한을 적용하는 대신 애플리케이션이 레코드를 사용할 수 있게 되었을 때 레코드를 수정할 수 있도록 한다.

 

성능

대용량 데이터 또는 동시 처리 요청을 처리할 때 ACID 데이터베이스에서 성능 문제가 발생할 수 있다. 데이터가 엄격한 순서로 처리되기 때문에 각 트랜잭션의 오버헤드로 인해 레코드에 액세스하는 모든 애플리케이션에 영향을 미치는 지연이 발생한다.

반면, BASE 데이터베이스에 액세스하는 애플리케이션은 언제든지 레코드를 처리할 수 있다. 따라서 과도한 지연 시간이 줄어들고 데이터베이스 처리량이 향상된다.

 

동기화

ACID 데이터베이스에는 트랜잭션의 변경 사항을 커밋하고 모든 관련 레코드에 이를 반영하기 위한 동기화 메커니즘이 필요하다. 그와 동시에, 트랜잭션이 완료되거나 폐기될 때까지 상대방이 액세스하지 못하도록 특정 레코드를 잠가야 한다.

반면, BASE 데이터베이스는 레코드를 잠그지 않고 실행되므로, 시간이 보장되지 않은 채 이후에 동기화된다. 개발자는 BASE 데이터베이스로 작업할 경우 특정 레코드를 처리할 때 불일치가 발생할 수 있다는 사실을 감안하여 애플리케이션에서 필요한 예방 조치를 취한다.

 

사용 사례

여러 가지 차이점이 있지만, ACID 및 BASE 데이터베이스 시스템은 모두 다양한 응용 분야에 활용된다.

 

ACID는 데이터 일관성, 신뢰성 및 예측 가능성이 요구되는 엔터프라이즈 애플리케이션에 이상적인 옵션이다.

예를 들어 은행의 경우 데이터 무결성이 무엇보다 중요하므로 ACID 데이터베이스를 사용하여 고객 거래를 저장한다.

 

반면, BASE 데이터베이스는 구조화되지 않은 대용량 데이터의 온라인 분석 처리에 더 적합한 옵션이다.

예를 들어 전자 상거래 웹 사이트에서는 BASE 데이터베이스를 사용하여 자주 변경되는 제품 가격을 업데이트한다. 이 경우 가격 정확성보다는 모든 고객이 제품 가격에 실시간으로 액세스할 수 있도록 하는 것이 더 중요하다.

 

 

 


참고

https://aws.amazon.com/ko/compare/the-difference-between-acid-and-base-database/

https://www.youtube.com/watch?v=sLJ8ypeHGlM

'DB' 카테고리의 다른 글

[DataBase/MySQL] MySQL 문법 정리  (2) 2025.12.04
[Database] 데이터베이스 기본 개념  (1) 2025.10.10