1.Why cross-service ACID transactions are difficult
A single database can give ACID guarantees (atomicity, consistency, isolation, durability) across multiple writes within that one database, because it controls the locking, logging and commit process for everything it manages. A workflow spanning multiple independent services, each with its own database, has no single component in that position — no one process can atomically lock rows across two different databases, no one process can guarantee both writes commit or both roll back together, because each database only knows how to be ACID with itself, not in coordination with another database it has never heard of.
Key features
- A single database's ACID guarantee only covers operations it directly manages — it has no mechanism to make a write in a completely different database part of the same atomic unit
- Atomicity across services would require every participating service to agree, at the same instant, to either all commit or all roll back — but each service can independently succeed, fail, or become unreachable at any point, with no shared clock or coordinator by default
- Isolation across services is even harder: a single database can lock a row to hide an in-progress change from other transactions; there is no equivalent cross-service lock that prevents another service from reading a "half-done" cross-service operation partway through
- Network partitions make the problem worse than a single-machine failure — a service can be unreachable rather than simply down, so a coordinator cannot even reliably tell "this service failed" apart from "this service succeeded but its confirmation was lost in transit"
- This is not a solvable engineering gap waiting for a better tool — it is a fundamental consequence of each service owning its own independent commit boundary, which is exactly why distributed transaction patterns (two-phase commit, sagas) exist as different trade-offs rather than a single "just make it ACID" fix
What a single database's ACID guarantee covers vs a cross-service operation
- INSERT order — Orders service, own DB
- leads to Order committed (succeeds)
- Order committed — fully consistent, alone
- on error, leads to UPDATE inventory (then)
- UPDATE inventory — briefly unreachable
Signature
each database is only ACID with itself — no shared commit boundary exists across services by default
A single database's ACID guarantee only covers what it directly manages — there is no built-in mechanism for making a write in one database part of the same atomic, isolated unit as a write in a completely separate database. The inconsistency risk lives in the space between services, which no single database's own transaction boundary was ever designed to cover.