On paper, 2PC is correct. In production, its weak point is the locking window. Every participant holds row locks from prepare until commit. The lesson's example is a 2PC across four services with 100 ms of cross-region latency. That holds locks for at least 400 ms. Under load, every write to the same rows lines up behind those locks, and throughput collapses.
PostgreSQL shows the same risk in its own documentation. A transaction left in the prepared state keeps every lock it held. The docs warn against leaving prepared transactions open for long.
A saga avoids locks, but moves the work into business logic. The lesson's order saga is: reserve inventory, charge payment, create shipment, confirm order. Each step needs an undo: release inventory, refund payment, cancel shipment. Some undos are easy. A card capture can be refunded. Others are hard or impossible. You cannot cancel a shipment that is already on a truck. Every edge case becomes a conversation with the business team.
One mistake to avoid: making each saga step its own 2PC transaction. You get the lock fan-out of 2PC and the visible half-states of a saga. Pick one model and keep to it.