backend-interview-guide

데이터베이스 트랜잭션 처리 및 일관성

목차

트랜잭션과 ACID 특성

트랜잭션(Transaction)은 데이터베이스에서 수행되는 하나의 작업 단위를 의미하며, 이 작업 단위는 완전히 성공하거나, 실패하여 아무것도 실행되지 않은 상태로 되돌아가야 합니다. 트랜잭션의 ACID 특성은 다음과 같이 정의됩니다:

ACID 특성

트랜잭션 격리 수준(Isolation Level)

트랜잭션 격리 수준은 동시에 실행되는 트랜잭션 간의 상호작용을 제어하는 방법을 의미합니다. 데이터베이스에서는 네 가지 주요 격리 수준이 있으며, 각 수준은 트랜잭션이 다른 트랜잭션에 미치는 영향을 다르게 제어합니다:

격리 수준

Dirty Read, Non-Repeatable Read, Phantom Read

분산 트랜잭션(Distributed Transaction)

분산 트랜잭션(Distributed Transaction)은 두 개 이상의 독립적인 데이터베이스 시스템 또는 서비스에 걸쳐 수행되는 트랜잭션을 의미합니다. 단일 데이터베이스 내에서의 트랜잭션과 달리, 분산 트랜잭션은 여러 시스템 간의 동기화를 필요로 하므로 모든 참여 시스템에서 트랜잭션의 원자성, 일관성, 고립성, 지속성(ACID 특성)을 보장해야 합니다. 이러한 이유로 분산 트랜잭션은 관리와 구현이 매우 복잡하며, 성능 저하를 유발할 수 있습니다.

분산 트랜잭션의 주요 과제

  1. 네트워크 장애: 분산 시스템에서는 네트워크 지연, 패킷 손실, 네트워크 분할 등의 문제로 인해 트랜잭션의 일관성을 유지하는 것이 어려울 수 있습니다.

  2. 참여자 간 동기화: 분산 트랜잭션은 여러 시스템이 참여하므로, 각 시스템이 동일한 트랜잭션 상태를 유지하도록 동기화하는 것이 필수적입니다. 이는 다양한 시스템 간의 시간차, 장애 상황, 리소스 가용성 등을 고려해야 하므로 복잡성이 증가합니다.

  3. 트랜잭션 롤백: 하나의 시스템에서 트랜잭션이 실패할 경우, 트랜잭션에 참여한 모든 시스템에서 롤백을 수행해야 합니다. 이를 위해서는 각 시스템이 이전 상태를 정확히 복구할 수 있어야 하며, 실패 관리가 매우 중요합니다.

분산 트랜잭션 관리 기법

2-Phase Commit (2PC)

2-Phase Commit은 분산 트랜잭션을 관리하는 대표적인 기법으로, 트랜잭션의 모든 참여자가 트랜잭션을 커밋할 준비가 되었는지 확인한 후에 트랜잭션을 커밋하는 과정을 두 단계로 나누어 처리합니다.

  1. 1단계 (Prepare): 트랜잭션 관리자는 트랜잭션에 참여한 모든 시스템(노드)에게 트랜잭션 준비(Prepare) 요청을 보냅니다. 각 노드는 자신이 트랜잭션을 커밋할 준비가 되었는지 확인한 후, 준비 완료 여부를 응답합니다. 이 과정에서 모든 참여자가 준비가 되었음을 확인받으면 트랜잭션은 준비 상태로 진입합니다.

  2. 2단계 (Commit): 모든 참여자가 준비 완료 응답을 보내면, 트랜잭션 관리자는 각 시스템에 커밋을 지시합니다. 모든 시스템이 커밋을 성공적으로 완료하면, 트랜잭션은 최종적으로 커밋됩니다. 그러나 만약 하나라도 실패한다면, 트랜잭션은 롤백되어 모든 시스템이 이전 상태로 복구됩니다.

장점:

단점:

3-Phase Commit (3PC)

3-Phase Commit은 2PC의 단점을 보완하기 위해 개발된 기법으로, 중간에 타임아웃 메커니즘을 도입하여 트랜잭션이 교착 상태에 빠지는 것을 방지합니다. 3단계로 트랜잭션을 처리하며, 단계별로 트랜잭션의 상태를 보다 명확하게 관리합니다.

단점:

Saga 패턴

Saga 패턴은 분산 트랜잭션에서 자주 사용되는 또 다른 해결책입니다. 트랜잭션을 여러 개의 작은 단계로 나누고, 각 단계가 성공하면 다음 단계로 넘어가며, 실패 시 이전 단계로 롤백하는 구조입니다. 각 단계는 독립적인 트랜잭션으로 처리되며, 모든 단계가 성공적으로 완료되면 전체 작업이 성공한 것으로 간주합니다.

장점:

단점:

분산 트랜잭션의 사용 사례

최종적 일관성 (Eventual Consistency)

최종적 일관성(Eventual Consistency)은 분산 시스템에서 중요한 일관성 모델 중 하나로, 여러 노드에 걸쳐 데이터를 복제하거나 분산할 때 사용됩니다. 이 모델에서는 즉각적인 데이터 일관성을 보장하지 않지만, 일정 시간이 지나면 시스템의 모든 노드가 일관된 상태에 도달하게 됩니다. 다음은 최종적 일관성에 대한 자세한 설명입니다.

기본 개념

최종적 일관성은 CAP 이론(Consistency, Availability, Partition tolerance)에서 주로 언급되는 개념입니다. CAP 이론에 따르면, 네트워크 파티션이 존재하는 상황에서 분산 시스템은 일관성, 가용성, 파티션 허용성 중 두 가지 특성만을 동시에 보장할 수 있습니다. 최종적 일관성은 이 세 가지 특성 중 가용성과 파티션 허용성을 우선시하면서 일관성은 일정 시간이 지나면 보장되는 모델입니다.

작동 방식

최종적 일관성은 다음과 같은 원리로 작동합니다:

  1. 데이터 업데이트: 사용자가 시스템에 데이터를 업데이트하면, 이 변경사항은 시스템의 모든 노드로 즉시 전파되지 않을 수 있습니다. 즉, 일부 노드는 최신 상태를 반영하지 않을 수 있습니다.
  2. 배포 지연: 데이터는 시스템의 모든 노드로 분산되는데 시간이 걸립니다. 이 과정에서 네트워크 지연이나 시스템 장애가 발생할 수 있으며, 특정 노드에 최신 데이터가 도달하기까지 시간이 걸릴 수 있습니다.
  3. 일관성 달성: 시간이 지나면서, 모든 노드는 이 데이터를 반영하게 되고, 시스템은 최종적으로 일관성 있는 상태에 도달합니다. 이 상태에서는 어느 노드에 접근하든지 동일한 데이터를 확인할 수 있습니다.

적용 사례

최종적 일관성은 여러 산업에서 다음과 같은 방식으로 활용됩니다:

장점

단점

고려 사항

최종적 일관성을 채택할 때는 시스템의 요구 사항에 따라 일관성 모델을 선택해야 합니다. 예를 들어, 사용자가 최종적인 데이터 정확성을 허용할 수 있다면 최종적 일관성 모델이 적합할 수 있습니다. 반대로, 실시간으로 정확한 데이터가 필요하다면, 보다 강한 일관성 모델을 선택해야 할 것입니다.

이처럼 최종적 일관성은 대규모 분산 시스템에서 데이터의 일관성을 효율적으로 관리하기 위한 중요한 개념입니다. 분산 시스템의 요구사항과 특성에 따라 이 모델을 활용하는 것이 중요합니다.