Database Concurrency & Scaling interview question · Most asked

Why shouldn't you call a payment API inside a database transaction?

Summary

The transaction holds row locks and a pooled connection for the whole call. A slow provider then blocks every other request needing those rows and exhausts the pool; and a rollback can't undo the charge.

Longer Answer

Restructure into short transactions around the database work:

  1. Reserve (conditional update + reserved row with expiry) and commit.
  2. Call the provider with an idempotency key derived from the reservation.
  3. Confirm in a second short transaction (WHERE status = 'reserved').

Add idle_in_transaction_session_timeout and lock_timeout as guard rails, and a sweeper for expired reservations.

Key Points

  • Locks and connections held until commit
  • External effects can't be rolled back
  • Reserve → call → confirm
  • Idempotency key on the external call

Deep dive: Long Transactions

More most-asked Database Concurrency & Scaling questions

← All Database Concurrency & Scaling questions