A transaction inside one database can commit several changes together. Across independent services, you need a protocol for partial completion. A saga records steps and compensating actions, such as releasing a room hold after a payment fails. Compensation is a new business operation; it'sn't a way to erase everything that happened. A sent email, for example, can't be unsent.
Persist the workflow state before advancing it. The same step may run again after a crash, so every side effect needs a stable key. An outbox keeps a local change and its pending event in one transaction; a relay can then retry delivery. You'll close the commit-to-publish gap, handle a failed compensation, and choose an order that postpones irreversible effects.