An order touches payment, inventory, shipping and notification. Four services, four databases, four deploy schedules. There is no BEGIN that spans them.
A saga replaces the transaction with a sequence of local ones, each paired with a compensating action that undoes it. Reserve stock, charge the card, book the courier. When the courier booking fails, the saga walks backwards — cancel the booking, refund the charge, release the stock.
There are two ways to run it. An orchestrator holds the flow in one place, which makes it easy to see, test and change, and makes that orchestrator a dependency every service now shares. Choreography has each service react to the previous one's event, which decouples them and scatters the flow across six codebases, where nobody can read it end to end.
The honest part is in the word compensating. A refund is a new transaction, visible on the customer's statement beside the charge. An email we sent cannot be unsent. What we get back is a consistent state, rather than a world in which none of it happened.
Where we can't undo an action, the design question becomes which actions we're willing to have taken by mistake.
