Repository navigation
Release v19.68.0
Summary
The .NET client can now protect the reads a decision depends on: inside a read-protected unit of work, every read is either guarded against changes made before the unit commits or explicitly marked advisory, and anything that cannot be guarded is refused with a clear reason.
Added
- Read protection for units of work: an enforcing unit owned by one invocation, protected decision reads that enrol before they return (
IDecisionReads.GetFor), guards on every public read and append entry point, owner-only completion, read allowances for advisory reads, and the append conditions a commit sends (GetAppendConditions) (#4888) - Protected decision reads of reducers and self-reducing read models, folding with the handler's declared event generation; filtered reducers and reducers with constructor dependencies are refused (#4888)
CHR0062reports an event source definition or stream whose concurrency leaves outEventSourceId, with a code fix (#4888)CHR0063reports an explicit concurrency scope for one stream passed to an append routed to another stream of the same event source (#4899)- A documentation page on read protection, and decision read documentation for reducers, pinned delivery and detached reads under read protection (#4888)
Changed
- An explicit concurrency scope whose tail was unavailable now guards an empty stream instead of being skipped;
ConcurrencyOptions.SkipIncompleteExplicitScopesrestores the old behaviour (#4898) - An explicit concurrency scope built for one stream of an event source is refused when passed to a single-route append to another stream of it;
ConcurrencyOptions.AllowRouteScopeStreamMismatchrestores the old behaviour (#4899) - The concurrency and Dynamic Consistency Boundary documentation states that revising or redacting an event is not detected by append conditions (part of #4900)
Fixed
- Events revised on SQL storage now report their revised generation to clients, so a client reading over gRPC can tell the content was revised instead of using the stale stored generation (#4888)