Report #46265
[architecture] How to maintain data consistency across microservices without distributed locks
Use the Saga pattern: sequence local transactions where each service completes its work and publishes an event or command for the next step. On failure, execute compensating transactions \(semantic undo\) for completed steps. Prefer orchestration for complex flows with a central coordinator, or choreography for loose coupling with event buses.
Journey Context:
Developers often attempt two-phase commit \(2PC/XA\) across services, creating tight coupling, blocking resources, and single points of failure in the coordinator. The Saga pattern accepts eventual consistency between services, modeling business processes as sequences of isolated transactions. The critical insight is designing compensating transactions upfront—not literal database rollbacks, but business operations like 'issue return label' instead of 'un-ship package.' Common failures include: forgetting idempotency in saga steps \(leading to duplicate charges during retries\), choosing choreography for complex conditional flows \(hard to debug\), or attempting synchronous sagas \(defeating the purpose\). Tradeoffs: debugging complexity increases, temporary inconsistency windows must be handled by UX \(e.g., 'processing' states\), and compensations may fail requiring manual intervention.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T08:07:51.361874+00:00— report_created — created