클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

Micro Service/mSVC&MSA

ACID 이해하기

Happy@Cloud 2020. 7. 29. 21:51

RDBMS는 분산 transaction환경에서 Data의 CRUD를 문제 없이 처리하기 위해 ACID(Atomicity, Consistency, Isolation, Durability)라는 특성을 지원합니다. 쉽게 말해, ACID란 데이터를 안전하게 처리하기 위한 RDBMS의 성질입니다.

ACID의 의미는 아래와 같습니다. 이해를 돕기 위해 '계좌이체' transaction을 예로 들겠습니다.

  • Atomicity(원자성): "All or nothing"
    • transaction의 시작과 종료사이에 일어난 data의 변경은 정상적이면 모두 저장(Commit)되어야 하고, 문제가 있으면 모두 취소(Rollback)되어야 한다.
    • 예) 송금이 50%만 진행되고 장애가 났다면 송금은 모두 취소된다.
    • 일부만 저장되면 안된다는 것이 더 이상 나뉠 수 없는 원자의 성질과 유사하여 '원자성'이라고 한다.
  • Consistency(일관성): "항상 유효한 데이터만 저장"
    • Data 저장 시 엄격한 규칙을 적용하여 DB가 안깨지도록 보장하는 성질
    • 예) 필드 길이, type, primary key 등
    • 많은 글들이 Consistency를 '트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것'이라고 설명하는데 wikipedia를 보면 이 설명은 틀리거나 너무 꼬아놓은것 같습니다.

  • Isolation(격리성): "다른 트랜잭션에 영향 최소화"
    • 여러개의 transaction이 동일한 DB를 CRUD할때 중간 처리 결과를 참조하지 못하게 하여 오류를 방지하는 성질
    • 예) 이체 transaction이 송금계좌에서 잔고를 줄이고 처리를 진행중인 상태에서 다른 transaction이 잔고를 읽으면 차감되기 전의 잔고가 리턴되게 한다. 에러가 나 이체가 취소될 수도 있으므로 최종 commit된 잔고를 리턴하는게 더 안전하다.
    • Isolation을 하는 방법에는 Read UnCommitted, Read Committed, Repeatable Read, Serializable이 있습니다.
      • Read Uncommitted: commit되지 않은 중간 데이터도 읽게 함 -> Dirty Read문제 발생.
      • Read Committed: Commit된 데이터만 읽게 함 -> Dirty update문제 발생
      • Repeatable Read: 동시 수행되는 Transaction들에게 일련번호를 부여하고 자기 일련번호에 해당하는 commit된 데이터만 읽게 함 -> Phantom Read 문제 발생 가능성
      • Serializable: 트랜잭션을 순서대로 수행. 성능이 저하되어 특수한 경우에만 쓰임
    • Isolation level에 대해서는 여기를 참조하세요.
  • Durability(영속성): "영구보관 보장"
    • Commit된 데이터는 장애가 나도 저장되며 수동으로 지우지 않는 한 영구적으로 보관된다는 성질

 

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림