Transaction
Ref.
[데이터베이스] 트랜잭션과 격리성
Transactional Outbox Pattern 알아보기
정의
트랜잭션(Transaction)은 데이터베이스에서 일련의 작업을 논리적으로 묶어서 원자성, 일관성, 고립성, 지속성을 보장하는 논리적 작업 단위
특징 (ACID)
- 원자성 (Atomicity)
- 트랜잭션은 모든 연산이 성공하거나 실패하는 원자적인 작업 단위로 간주됩니다. 트랜잭션 내의 모든 연산이 성공하면 데이터베이스에 모든 변경 사항이 반영되고, 하나의 연산이라도 실패하면 데이터베이스는 이전의 일관된 상태로 롤백됩니다.
- 일관성 (Consistency)
- 트랜잭션이 실행을 완료한 후에도 데이터베이스는 일관된 상태를 유지해야 합니다. 트랜잭션이 일관성 있는 상태로 종료되면 데이터베이스는 일관성을 보장합니다.
- 고립성 (Isolation)
- 여러 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션은 서로 간섭하지 않고 독립적으로 실행되는 것처럼 보장되어야 합니다. 다른 트랜잭션의 실행 중에도 한 트랜잭션의 결과는 다른 트랜잭션에게 보이지 않아야 합니다.
- 지속성 (Durability)
- 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야 합니다. 시스템 장애 또는 다른 문제가 발생해도 트랜잭션의 결과는 손실되지 않아야 합니다.
Transaction Outbox 패턴
정의
Transaction Outbox 패턴은 분산 환경에서 트랜잭션 데이터를 안전하게 다른 서비스에 전파하는 패턴입니다. 이 패턴은 데이터베이스 트랜잭션과 이벤트 브로커를 조합하여 사용됩니다.
서로 다른서버의 DB (A, B)를 동시에 연계하여 다룰때 A서버에서만 처리되고 B서버에서는 처리되지 않을 경우 데이터의 정합성보장이 되지 않을 경우를 대비하는 패턴입니다.
- 트랜잭션 데이터 삽입 : 트랜잭션을 시작할 때, 데이터베이스에 해당 트랜잭션에 대한 변경 사항을 저장합니다. 이를 Outbox 테이블이나 컬렉션에 저장합니다. Outbox 테이블은 트랜잭션 아이디와 함께 트랜잭션 동안 발생한 변경 사항을 기록하는 역할을 합니다.
- 트랜잭션 완료 후 이벤트 발행 : 트랜잭션이 성공적으로 커밋되면, 트랜잭션 아이디와 함께 저장된 변경 사항을 이벤트 브로커에 전달합니다. 이벤트는 트랜잭션 데이터의 변경 내용을 담고 있습니다.
- 이벤트 소비 : 다른 서비스들은 이벤트 브로커를 통해 발생한 이벤트를 수신하고, 해당 이벤트에 따라 자신의 데이터를 갱신합니다. 이로써 여러 서비스 간에 데이터 일관성을 유지할 수 있습니다.
장점
- 트랜잭션의 일관성을 유지하면서 분산 환경에서 데이터를 안전하게 전파할 수 있습니다.
- 이벤트 브로커를 사용하여 이벤트를 비동기적으로 처리하므로 시스템이 느려지지 않습니다.
주의할 점
- 이 패턴을 사용하려면 데이터베이스의 트랜잭션과 이벤트 브로커가 모두 안전하게 처리되어야 합니다.
- Outbox 테이블의 스키마와 이벤트 메시지 형식은 명확하게 정의되어야 합니다.