2단계에 거쳐 영속하는 작업
Transaction Coordinator가 위 2개의 서비스의 호출이 정상적으로 이루어지면 전체 데이터를 Commit하고, 만약 특정 서비스에 오류가 발생하면 Transaction Coordinator는 이전 쿼리의 결과를 모두 롤백 한다.
위의 방법은 DB 트랜잭션을 사용하므로 데드락이 발생할 수 있고, RDBMS 에서만 가능한 방법이다.(NoSQL의 경우 분산 트랜잭션을 지원하지 않음) 또한, Transaction Coordinator 가 맛이 가면 트랜잭션 관리를 해줄 것이 없어진다.
Saga 패턴은 2가지로 구분할 수 있다.
순차적으로 이벤트가 전달되면서 트랜잭션이 관리되는 방법이다.
이벤트가 RabbitMQ, Kafka 같은 메시지 큐 미들웨어를 사용하여 비동기 방식 or 분산처리 방법으로 처리된다.
순차적으로 이벤트를 발행하여 Commit 한 다음, 중간에 에러가 터지면 취소 이벤트로 롤백을 한다.
위의 경우 중간에 오류가 나면 현재 트랜잭션 상태에 대해 파악하기 어렵다는 단점이 있다.
서비스가 직접 Event를 직접 구독하지 않고, Saga Orchestrator에서 Event를 구독한 후, 각 서비스를 호출하여 트랜잭션을 관리한다.