ACID
데이터베이스 관리 시스템(DBMS)에서 ACID는 트랜잭션의 신뢰성과 일관성을 정의하는 네 가지 주요 특성.
ACID는 Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)의 약자
ACID의 중요성:
- 데이터 무결성 유지
- 트랜잭션의 신뢰성 보장
- 동시성 제어
- 시스템 장애 복구
- 비즈니스 규칙 및 관계형 무결성 강화
장점:
- 데이터 일관성 유지
- 트랜잭션 무결성 보장
- 내결함성 및 복구 기능 제공
- 동시성 제어 가능
단점:
- 처리 오버헤드로 인한 성능 저하
- 대용량 OLTP 시스템에서의 성능 문제
- 제한적인 잠금으로 인한 확장성 제한
Atomicity (원자성)
원자성은 트랜잭션이 단일의 불가분한 작업 단위로 취급되어야 함을 의미합니다.
- 트랜잭션의 모든 작업이 성공적으로 완료되거나 전혀 실행되지 않아야 합니다.
- 트랜잭션 중 일부가 실패하면 전체 트랜잭션이 롤백되어 원래 상태로 돌아갑니다.
- 이는 데이터의 일관성과 무결성을 보장합니다.
이 송금 트랜잭션에서 첫 번째 UPDATE는 성공했지만 두 번째 UPDATE가 실패한다면, 원자성 때문에 첫 번째 UPDATE도 롤백된다.
마치 아무 일도 없었던 것처럼 모든 변경사항이 취소되는 것.
이는 “all or nothing” 원칙이라고도 부른다.
Consistency (일관성)
일관성은 트랜잭션이 데이터베이스를 한 일관된 상태에서 다른 일관된 상태로 변경해야 함을 의미합니다.
- 트랜잭션 실행 전후에 데이터베이스가 일관된 상태를 유지해야 합니다.
- 고유 키, 외래 키 등의 제약 조건이 유지되어야 합니다.
- 이는 데이터의 정확성과 유효성을 보장합니다.
예를 들어, 계좌 잔고가 항상 0 이상이어야 한다는 규칙이 있다면, 제약조건에 위배되는 트랜잭션은 실행되지 않으며, 데이터베이스의 일관성이 유지된다.
Isolation (격리성)
격리성은 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않고 독립적으로 실행되어야 함을 의미합니다.
- 각 트랜잭션은 다른 트랜잭션으로부터 격리되어 실행됩니다.
- 이는 더티 리드(dirty read), 반복 불가능한 읽기(non-repeatable read), 팬텀 읽기(phantom read) 등의 문제를 방지합니다.
- 트랜잭션의 동시성을 관리하여 데이터의 일관성을 유지합니다.
격리 수준
READ UNCOMMITTED (가장 낮은 격리 수준)
다른 트랜잭션의 커밋되지 않은 변경사항도 볼 수 있다.
이로 인해 “Dirty Read” 문제가 발생할 수 있습니다.READ COMMITTED
커밋된 데이터만 읽을 수 있지만, “Non-repeatable Read” 문제가 발생할 수 있다.REPEATABLE READ
트랜잭션 내에서 같은 쿼리는 항상 같은 결과를 반환하지만, “Phantom Read” 문제가 발생할 수 있다.SERIALIZABLE (가장 높은 격리 수준)
트랜잭션들이 순차적으로 실행되는 것처럼 동작하여 모든 동시성 문제를 방지.
Durability (지속성)
지속성은 트랜잭션이 성공적으로 완료된 후 그 결과가 영구적으로 저장되어야 함을 의미합니다.
- 시스템 장애나 전원 손실 등의 상황에서도 트랜잭션의 결과가 유지되어야 합니다.
- 이는 주로 로그 파일을 사용하여 구현됩니다. 변경 사항을 먼저 로그 파일에 기록한 후 데이터베이스에 반영합니다.
ACID 특성의 실제 적용
예를 들어, 온라인 쇼핑몰에서 상품 구매 처리를 살펴보자.
|
|
이 트랜잭션에서:
- Atomicity: 모든 단계가 성공적으로 완료되거나, 전체가 취소된다.
- Consistency: 재고와 잔액이 음수가 되지 않도록 보장한다.
- Isolation: 다른 구매 트랜잭션과 충돌하지 않도록 한다.
- Durability: 구매 완료 후 시스템이 중단되어도 데이터는 보존된다.