Start here. This is the direct spoken answer to practice first.
Overview
Running a listener after commit does not persist the intent to run it; an outbox closes that durability gap.
@TransactionalEventListener invokes a listener according to a transaction phase, commonly after commit. That is useful for in-process work that should happen only if the transaction succeeds. It is not a durable queue: the process can commit the database transaction and crash before or during the listener. A transactional outbox writes the business change and an outbox record in the same database transaction, then a separate publisher retries delivery.