@@ -727,6 +727,29 @@ type ReadOnlyDatastore interface {
727727
728728 // SnapshotReader creates a read-only handle that reads the datastore at the specified revision.
729729 // Any errors establishing the reader will be returned by subsequent calls.
730+ //
731+ // Reads through the handle behave like a snapshot: they are repeatable, and
732+ // they never observe a write committed after the given revision.
733+ // Each engine reaches that guarantee differently:
734+ //
735+ // - Postgres and MySQL treat the revision as a transaction snapshot and
736+ // filter each row against it, keeping only rows created at or before
737+ // the revision and not yet deleted as of it. Postgres in strict read
738+ // mode additionally asserts that the revision is present on the
739+ // instance being read, so a lagging replica fails the query with a
740+ // RevisionUnavailableError instead of answering from older data.
741+ // - CockroachDB and Spanner treat the revision as an MVCC timestamp and
742+ // leave the filtering to the database, in both cases pinned to exactly
743+ // that timestamp rather than to the nearest one at or after it:
744+ // CockroachDB appends AS OF SYSTEM TIME <revision> to each query, and
745+ // Spanner bounds a read-only transaction with ReadTimestamp. A
746+ // revision the database no longer retains, or one in the future, fails
747+ // at query time rather than when the handle is created.
748+ // - memdb keeps one in-memory snapshot per write and reads from the most
749+ // recent snapshot at or before the revision, falling back to its
750+ // oldest snapshot for a revision that predates the datastore itself.
751+ // It is also the only implementation that validates the revision when
752+ // the handle is created, rather than when it is first read.
730753 SnapshotReader (Revision ) Reader
731754
732755 // OptimizedRevision gets a revision that will likely already be replicated
0 commit comments