Whitepapers

StrataDB has no begin / commit / rollback. Writes commit automatically, each into a versioned commit unit, and the commit timeline that results is what powers time travel. This page explains how commits and versions work under the hood; the product-level view is in commits and time travel.

Writes auto-commit

Every write is applied as a commit unit — an atomic unit of change that the storage commit runtime allocates a version for, orders, and makes durable through the write-ahead log before its effects become visible. There is no session to open and no transaction to hold; a write either commits as a unit or does not apply.

The commit unit is internal machinery. What the product exposes on top of it is clear write and batch semantics, not a manual transaction API — a deliberate V1 decision, because a public transaction surface would imply an isolation and ACID contract the product does not claim.

Versions and the commit timeline

Two facts travel with every commit, and both are storage-native substrate, not engine bookkeeping:

  • a version — monotonically allocated, the identity of that committed state;
  • a commit timestamp — one timestamp stamped on the whole committed batch.

Storage persists a per-branch timeline mapping commit version to timestamp, and exposes timestamp-to-version resolution to the engine. That timeline is the entire basis for reading the past: because every commit is on it, “the database as of timestamp T” resolves to a concrete version, and every capability reads consistently at that version.

The division of labor is clean: storage owns the timeline as a fact; the engine owns the product experience of as_of, branch-from-time, and timeline explanations. See the storage substrate for where the commit runtime sits (L7) in the layering.

Batches are itemwise under one commit

A batch applies many items in one call. StrataDB’s batches are itemwise: you get one positional result per input item, and an outer status summarizes whether all, some, or none succeeded. The valid items the engine applies together share one commit — so a batch is atomic at the commit-unit level while still reporting per-item outcomes. Batches are part of the command surface used by the SDKs, the MCP tools, and the raw command path rather than a bare CLI verb.

Why no manual transactions

The engine keeps the internal commit machinery it needs, but the product surface stops at write and batch semantics on purpose:

  • Auto-commit means an agent or application never leaves a transaction open, never deadlocks on a held lock, and retries idempotently.
  • The absence of a session removes a whole class of misuse — partial commits, forgotten rollbacks, long-lived read snapshots pinning resources.
  • Isolation is provided by branches: to work against an isolated view, you fork a branch, not open a transaction.

If a future product decision ever introduces a public transaction, it would come with an explicit isolation contract, backend requirements, and a conformance suite — it is not something the current architecture leaves half-exposed.

Versioning is uniform across capabilities

Because versioning lives in the substrate under the single physical row, it applies identically to KV, JSON, events, vectors, and graphs — one commit can span several capabilities and lands as one versioned unit, and a historical read at a version sees all of them consistently. That uniformity is a direct consequence of one substrate underneath rather than per-capability version schemes.

agents: this page as markdown → /architecture/commits-and-versioning.md