99클럽 TIL

99클럽 코테 스터디 20일차 DB ACID

차가리 2024. 6. 8. 16:28
728x90
  • DB
    • Index
      • Index 작동 원리
      • Index 종류
        • B-Tree 인덱스
        • Hash Indexes
        • Bitmap Index
        • GIST(Generalized Search Tree)
        • R-Tree
        • Full Text Index
        • Spatial Index
        • Trie(Prefix Tree) Index
        • Covering Index
  • 영속성
  • 트랜잭션
  • ORM
  • ACID
  • N+1 문제
  • DB 정규화
  • Data Replication
  • sharding 전략
  • CAP 이론

#ACID

ACID란?

  • DB 에서 ACID 는 데이터베이스 관리 시스템(DBMS) 이 트랜잭션 처리를 안정적이고 정확하게 처리할 수 있도록 보장하는 네 가지 주요 속성임.

Atomicity(원자성)

  • 하나의 트랜잭션에 속한 모든 작업이 전부 성공하거나 전부 실패 해서 결과를 예측할 수 있어야 함.

트랜잭션이 전부 실행되거나 전혀 실행되지 않는 것을 보장하는 속성.

원자성은 한 트랜잭션 내에서 여러 개의 작업이 수행될 때 모든 작업이 성공적으로 완료되거나, 그렇지 않은 경우 모든 작업이 롤백(취소) 되어야 함을 의미함.

은행 시스템에서 사용자 A가 사용자 B에게 돈을 이체하는 트랜잭션이 있다고 가정해보면, 이 트랜잭션은 두 개의 주요 단계로 이루어짐.

A 의 계좌에서 돈을 차감하고, B의 계좌에 돈을 추가함. 원자성이 보장된다면, 이 두 작업이 모두 성공적으로 완료되거나, 그렇지 않은 경우 어떤 작업도 완료되지 않아야함. 

만약 트랜잭션 중에 시스템에 문제가 발생하여 중단 된다면, 이미 실행된 작업들은 취소되어야 하며, A와 B의 계좌 모두 원래 상태로 복구되어야함.

트랜잭션의 신뢰성과 데이터 일관성을 보장하는데 중요하다.

Consistency(일관성)

  • 데이터베이스의 상태가 일관 되어야 한다는 성질. 트랜잭션 이후의 데이베이스의 상태는 이전과 같이 유효해야 함.

트랜잭션이 데이터베이스의 일관된 상태에서 시작하여 트랜잭션이 완료된 후에도 데이터베이스가 일관된 상태를 유지해야 한다는 것을 의미함.
➡️ 트랜잭션이 데이터베이스의 모든 규칙과 제약조건을 준수해야 함을 의미하며, 이를 통해 데이터의 정확성과 무결성이 보장됨.

예를 들어, 은행 시스템에서 사용자의 계좌 잔액은 결코 음수가 되어서는 안됨.

이는 계좌 잔액에 대한 "음수가 아님" 이라는 제약 조건을 설정하는 것을 의미함.

트랜잭션 중에 사용자 A가 사용자 B에게 금액을 이체하는 경우, 이체 동작이 완료된 후에도 A와 B의 계좌 잔액은 이 제약 조건을 충족해야함. 만약 A의 계좌에서 돈을 차감한 후 시스템에 문제가 발생하여 B의 계좌에 돈이 추가되지 않는다면, 트랜잭션은 원자성에 따라 롤백되어야 하며, 일관성을 유지하기 위해 A의 계좌도 원래 상태로 복구되어야 함.

데이터베이스 시스템은 이러한 일관성을 유지하기 위해 트랜잭션 전과 후에 데이터가 모든 관련 규칙과 제약조건을 준수하는지 체크함. 또한, 이러한 제약 조건들은 데이터베이스 관리 시스템에 의해 강제되며, 무결성 제약 조건(integrity constraints), 외래키 제약 조건(foreign key constraints), 유일성 제약 조건(unique constraints) 등이 있음.

Isolcation(격리성, 독립성)

  • 모든 트랜잭션은 다른 트랜잭션으로부터 독립 되어야 한다는 뜻

다중 트랜잭션이 동시에 실행될 때 각 트랜잭션이 서로 영향을 주지 않도록 보장하는 속성임. 이 고립성은 하나의 트랜잭션이 다른 트랜잭션의 중간 결과를 보지 않게 하며, 이를 통해 각 트랜잭션이 마치 시스템을 단독으로 사용하고 있는 것처럼 작동할 수 있도록 함.

왜 중요?

  • 격리성이 제대로 보장되지 않으면 다음과 같은 문제가 발생할 수 있음.
    1. Dirty Reads
      • 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽는 경우. 이로 인해 아직 확정되지 않은 데이터를 기반으로 연산이 이루어질 수 있음.
    2. Non-repeatable Reads
      • 한 트랜잭션 동안 두 번 같은 데이터를 읽었을 때, 첫 번째와 두 번째 읽기 사이에 다른 트랜잭션이 해당 데이터를 수정하면 서로 다른 결과를 얻는 문제
    3. Phantom Reads
      • 한 트랜잭션 동안 두 번 쿼리를 실행했을 때, 첫 번째 쿼리와 두 번째 쿼리 사이에 다른 트랜잭션이 새로운 데이터를 삽입하면 두 쿼리 결과가 달라지는 현상

격리수준
SQL 표준에서는 다음 4가지 격리 수준을 정의하여 위 문제를 해결

  1. Read Uncommitted
    가장 낮은 격리 수준으로, 다른 트랜잭션이 커밋하지 않은 데이터를 읽을 수 있음(Dirty Read)
  2. Read Committed
    커밋된 데이터만 읽을 수 있으며, Dirty Reads 는 방지하지만 Non-repeatable Reads 는 여전히 발생할 수 있음.
  3. Repeatable Read
    한 트랜잭션이 읽기를 시작한 데이터는 그 트랜잭션이 종료될 때 까지 다른 트랜잭션이 수정할 수 없음. 이로 인해 Non-repeatable Reads 는 방지되지만 Phantom Reads 는 여전히 발생할 수 있음.
  4. Serailizable
    가장 높은 격리 수준으로, 트랜잭션이 완벽히 순차적으로 실행되는 것처럼 보장함. 모든 읽기 쓰기가 완전히 독립적이여서 모든 종류의 읽기 문제를 방지함.

예시

두 개의 은행 계좌 트랜잭션이 동시에 발생한다고 가정
트랜잭션 A : 계좌 X에서 100달러를 인출함.
트랜잭션 B : 동일한 계좌 X에서 200달러를 입금함.

두 트랜잭션이 격리되어 있지 않다면, A의 인출 연산과 B의 입금 연산이 서로 간섭하여 계좌의 최종 잔액 계산이 잘못될 수 있음. 예를 들어, A의 인출 동작이 B의 입금 결과를 고려하지 않은 상태에서 처리된다면, 잔액이 예상과 다르게 계산될 수 있음.
격리 수준이 충분히 높으면, 각 트랜잭션이 서로 독립적으로 처리되어 올바른 잔액을 보장받을 수 있음.

Durability(지속성)

  • 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그(기록) 가 남아야 함. 만약 Runtime 오류나 시스템 오류가 발생하더라도 해당 기록은 영구적이여야 한다는 뜻

왜 중요함?

지속성은 데이터베이스 시스템이 예기치 않은 중단(예:전원 실패, 시스템 크래시 등) 후에도 데이터의 손실 없이 이전 상태를 유지하거나 복구할 수 있도록 보장함. 이는 금융 거래, 중요 비즈니스 데이터의 처리 및 저장과 같은 중요한 어플리케이션에서 중요함.

기술

1.Write-Ahead Logging(WAL)
대부분의 관계형 데이터베이스 시스템에서 사용하는 기술로, 데이터를 데이터베이스 파일에 기록하기 전에 먼저 로그 파일에 변경 사항을 기록함. 이 로그를 사용하여 시스템 장애 후에도 트랜잭션 커밋 전의 상태로 데이터를 복구할 수 잇음.

  1. Redundancy
    데이터의 복제본을 여러 서버 또는 디스크에 저장하여, 하나의 저장 매가 실패해도 다른 곳에서 데이터를 복구할 수 있도록 함.
  2. Backup
    정기적으로 데이터베이스의 전체 백업 또는 증분 백업을 수행하여, 장애 발생 시 이전 상태로 복구할 수 있는 데이터의 복사본을 보유함.
728x90