The Outbox Pattern, Explained by a Real Problem (Without Breaking the App)

The obvious solution is a database transaction. Here’s why that breaks across two databases, and what I did instead.