사가는 보상 트랜잭션으로 변경분을 롤백한다
ACID 트랜잭션은 비즈니스 로직 실행 도중 규칙에 위배되면 쉽게 롤백이 가능합니다. DB에서 ROLLBACK하면 그 시점까지 변경된 내용은 모두 언두되죠. 하지만 사가는 단계마다 로컬 DB에 변경분을 커밋하므로 자동 롤백은 불가능합니다. 가령 주문 생성 사가 4번째 단계에서 신용카드 승인이 실패하면 1~3번째 단계에서 적용된 변경분을 명시적으로 언두해야 합니다. 즉, 보상 트랜잭션(compensating transaction)을 미리 작성해야 합니다.
(N + 1)번째 사가 트랜잭션이 실패하면 이전 N개의 트랜잭션을 언두해야 합니다. 개념적으로 단계 Ti에는 Ti의 작용(effect)을 언두하는 보상 트랜잭션 Ci가 대응되며, 처음 N개 단계의 작용을 언두하려면 사가는 각 Ci를 역순으로 실행하면 됩니다. 그림 4-3과 같이 T1 … Tn 순서로 트랜잭션이 실행되다가 Tn+1에서 실패할 경우 T1 … Tn을 언두하고 Cn … C1을 순서대로 실행합니다.
▲ 그림 4-3 비즈니스 규칙에 위배되어 어느 사가 단계에서 실패하면 사가는 보상 트랜잭션을 실행하여 이전 단계에서 발생한 업데이트를 언두한다