Implementing Concurrency Control

1. Using Optimistic Locking

Assume conflicts are rare; detect at write time using version/ETag.

MechanismHow
HTTP ETagIf-Match header check
Version fieldWHERE version = ? AND id = ?
TimestampLast-Modified / If-Unmodified-Since

2. Using If-Match Header

ResultStatus
ETag matches → apply mutation200/204
ETag mismatch → reject412 Precondition Failed
Header missing428 Precondition Required (optional)

3. Using If-Unmodified-Since Header

BehaviorResult
Resource unchanged since date → apply200/204
Modified after date → reject412 Precondition Failed

4. Handling Concurrent Update Conflicts

ResolutionUX
Last-write-winsSilent overwrite (rarely correct)
Reject + 409/412Client refetches and retries
Three-way mergeDiff + auto-merge non-conflicting fields
CRDTConflict-free auto-merge

5. Implementing Version Numbers

Example: Version-Based Update

UPDATE users
SET name = ?, version = version + 1, updated_at = NOW()
WHERE id = ? AND version = ?;
-- If 0 rows affected → conflict

6. Using Last-Modified Timestamps

ProsCons
Human-readable1-second granularity insufficient for fast updates
Built-in HTTP supportClock skew issues across servers

7. Implementing Pessimistic Locking

MechanismUse Case
SQL SELECT FOR UPDATEHold DB row lock during transaction
Distributed lock (Redis, ZooKeeper)Multi-instance critical section
Lease tokensTime-limited exclusive access
Warning: Avoid for HTTP APIs — they're stateless. Pessimistic locks block other writers; risk deadlocks.

8. Handling Lock Expiration

StrategyImplementation
TTL on lockAuto-release after N seconds
Heartbeat extensionClient renews lock periodically
Owner verificationToken check on release

9. Providing Conflict Resolution Strategies

Example: Conflict Response with Diff

{
  "type": "https://example.com/errors/conflict",
  "title": "Update Conflict",
  "status": 409,
  "currentVersion": "v5",
  "yourVersion": "v3",
  "currentResource": {...},
  "diff": [
    {"field": "email", "yours": "a@x.com", "theirs": "b@x.com"}
  ]
}

10. Documenting Concurrency Behavior

DocumentationContent
Concurrency modelOptimistic vs pessimistic
Required headersIf-Match for mutations
Conflict formatError response shape
Retry guidanceRefetch + retry strategy