Here's a sequence that shows up in almost every Laravel app that talks to the outside world:
Charge the customer's card.
Create a policy (or order, or booking) with a partner API.
Generate a PDF confirmation.
Step 3 throws. Maybe the PDF library ran out of memory, maybe the storage disk is full. Whatever the reason, you're now sitting on a charged card and a partner-side record that your own database has no idea exist. DB::transaction() can't save you here — it only knows about your own database. The payment gateway and the partner API have already committed their side of the world, and nothing you do to your own tables will undo that.






