[Internal] DistributedTransactions: Refactors INTERNAL flag to PREVIEW for preview release#5911
Merged
Meghana-Palaparthi merged 3 commits intoMay 29, 2026
Conversation
…for preview release Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
c935ffb to
9f7a4d5
Compare
…ypes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kushagraThapar
approved these changes
May 29, 2026
jeet1995
approved these changes
May 29, 2026
4 tasks
Meghana-Palaparthi
added a commit
that referenced
this pull request
Jun 2, 2026
## Release 3.61.0 ### Version Changes | Property | Previous | New | |---|---|---| | ClientOfficialVersion | 3.60.0 | 3.61.0 | | ClientPreviewVersion | 3.61.0 | 3.62.0 | | ClientPreviewSuffixVersion | preview.0 | preview.0 | ### Changelog (3.61.0 GA) #### Features Added - [5815](#5815) Read Consistency Strategy: Adds hub region header for LastCommittedSingleWriteRegion strategy. - [5848](#5848) VectorEmbeddingPolicy: Adds EmbeddingSource block to Embedding model - [5867](#5867) Diagnostics: Adds hedging detection API - [5600](#5600) HPK: Adds id to partition key when "/id" is the last path in partition key definition. #### Bugs Fixed - [5827](#5827) ChangeFeedEstimator: Change feed estimator threw ArgumentNullException when an inmemory lease container was being used. - [5910](#5910) Upgraded Direct package to 3.43.2. - [5910](#5910) Direct: Fixed RNTBD thread-pool starvation by making Dispatcher.OnIdleTimer asynchronous. #### Other Changes - [5887](#5887) Direct: Documents that MaxTcpConnectionsPerEndpoint accepts any positive value. ### Changelog (3.62.0-preview.0 - preview only) #### Features Added - [5838](#5838) EmbeddingGenerator: Adds ICosmosEmbeddingGenerator client-wide configuration (preview) - [5911](#5911) DistributedTransaction: Adds DistributedReadTransaction and DistributedWriteTransaction APIs (preview) ### API Contract Diff (GA) ```diff diff --git "a/Microsoft.Azure.Cosmos\\contracts\\API_3.60.0.txt" "b/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0.txt" index ad39f9b..767b792 100644 --- "a/Microsoft.Azure.Cosmos\\contracts\\API_3.60.0.txt" +++ "b/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0.txt" @@ -434,7 +434,10 @@ namespace Microsoft.Azure.Cosmos public abstract IReadOnlyList<ValueTuple<string, Uri>> GetContactedRegions(); public virtual int GetFailedRequestCount(); public virtual ServerSideCumulativeMetrics GetQueryMetrics(); + public virtual IReadOnlyList<RequestedRegion> GetRequestedRegions(); + public virtual IReadOnlyList<string> GetRespondedRegions(); public virtual Nullable<DateTime> GetStartTimeUtc(); + public virtual bool HedgingStarted(); public abstract override string ToString(); } public class CosmosException : Exception, ICloneable @@ -1033,6 +1036,28 @@ namespace Microsoft.Azure.Cosmos public const string WestUS2 = "West US 2"; public const string WestUS3 = "West US 3"; } + public struct RequestedRegion : IEquatable<RequestedRegion> + { + public RequestedRegion(string regionName, RequestedRegionReason reason); + public RequestedRegionReason Reason { get; } + public string RegionName { get; } + public bool Equals(RequestedRegion other); + public override bool Equals(object obj); + public override int GetHashCode(); + public override string ToString(); + } + public enum RequestedRegionReason : byte + { + CircuitBreakerProbe = (byte)6, + Hedging = (byte)4, + Initial = (byte)1, + OperationRetry = (byte)2, + RegionFailover = (byte)5, + TransportRetry = (byte)3, + Unknown = (byte)0, + } public abstract class RequestHandler { protected RequestHandler(); ``` ### API Contract Diff (Preview) ```diff diff --git "a/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0-preview.0.txt" "b/Microsoft.Azure.Cosmos\\contracts\\API_3.62.0-preview.0.txt" index efd0a07..02f51c1 100644 --- "a/Microsoft.Azure.Cosmos\\contracts\\API_3.61.0-preview.0.txt" +++ "b/Microsoft.Azure.Cosmos\\contracts\\API_3.62.0-preview.0.txt" @@ -367,6 +367,7 @@ namespace Microsoft.Azure.Cosmos public CosmosClient(string connectionString, CosmosClientOptions clientOptions=null); public CosmosClient(string accountEndpoint, string authKeyOrResourceToken, CosmosClientOptions clientOptions=null); public virtual CosmosClientOptions ClientOptions { get; } + public virtual ICosmosEmbeddingGenerator EmbeddingGenerator { get; } public virtual Uri Endpoint { get; } public virtual CosmosResponseFactory ResponseFactory { get; } public static Task<CosmosClient> CreateAndInitializeAsync(string accountEndpoint, AzureKeyCredential authKeyOrResourceTokenCredential, IReadOnlyList<ValueTuple<string, string>> containers, CosmosClientOptions cosmosClientOptions=null, CancellationToken cancellationToken=default(CancellationToken)); @@ -378,6 +379,8 @@ namespace Microsoft.Azure.Cosmos public virtual Task<DatabaseResponse> CreateDatabaseIfNotExistsAsync(string id, ThroughputProperties throughputProperties, RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); public virtual Task<DatabaseResponse> CreateDatabaseIfNotExistsAsync(string id, Nullable<int> throughput=default(Nullable<int>), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); public virtual Task<ResponseMessage> CreateDatabaseStreamAsync(DatabaseProperties databaseProperties, Nullable<int> throughput=default(Nullable<int>), RequestOptions requestOptions=null, CancellationToken cancellationToken=default(CancellationToken)); + public virtual DistributedReadTransaction CreateDistributedReadTransaction(); + public virtual DistributedWriteTransaction CreateDistributedWriteTransaction(); public void Dispose(); protected virtual void Dispose(bool disposing); public virtual Container GetContainer(string databaseId, string containerId); @@ -401,6 +404,7 @@ namespace Microsoft.Azure.Cosmos public Nullable<ConsistencyLevel> ConsistencyLevel { get; set; } public CosmosClientTelemetryOptions CosmosClientTelemetryOptions { get; set; } public Collection<RequestHandler> CustomHandlers { get; } + public ICosmosEmbeddingGenerator EmbeddingGenerator { get; set; } public Nullable<bool> EnableContentResponseOnWrite { get; set; } public bool EnableRemoteRegionPreferredForSessionRetry { get; set; } public bool EnableTcpConnectionEndpointRediscovery { get; set; } @@ -511,9 +515,19 @@ namespace Microsoft.Azure.Cosmos public abstract IReadOnlyList<ValueTuple<string, Uri>> GetContactedRegions(); public virtual int GetFailedRequestCount(); public virtual ServerSideCumulativeMetrics GetQueryMetrics(); + public virtual IReadOnlyList<RequestedRegion> GetRequestedRegions(); + public virtual IReadOnlyList<string> GetRespondedRegions(); public virtual Nullable<DateTime> GetStartTimeUtc(); + public virtual bool HedgingStarted(); public abstract override string ToString(); } + public sealed class CosmosEmbeddingResult + { + public CosmosEmbeddingResult(IReadOnlyList<ReadOnlyMemory<float>> vectors, Nullable<int> totalTokens=default(Nullable<int>), Nullable<TimeSpan> latency=default(Nullable<TimeSpan>)); + public Nullable<TimeSpan> Latency { get; } + public Nullable<int> TotalTokens { get; } + public IReadOnlyList<ReadOnlyMemory<float>> Vectors { get; } + } public class CosmosException : Exception, ICloneable { public CosmosException(string message, HttpStatusCode statusCode, int subStatusCode, string activityId, double requestCharge); @@ -668,6 +682,69 @@ namespace Microsoft.Azure.Cosmos DotProduct = 2, Euclidean = 0, } + public abstract class DistributedReadTransaction : DistributedTransaction + { + protected DistributedReadTransaction(); + public abstract DistributedReadTransaction ReadItem(Container container, PartitionKey partitionKey, string id, DistributedTransactionRequestOptions requestOptions=null); + } + public abstract class DistributedTransaction + { + protected DistributedTransaction(); + public abstract Task<DistributedTransactionResponse> CommitTransactionAsync(CancellationToken cancellationToken=default(CancellationToken)); + } + public class DistributedTransactionOperationResult + { + public virtual string ETag { get; } + public virtual int Index { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual double RequestCharge { get; } + public virtual Stream ResourceStream { get; } + public virtual HttpStatusCode StatusCode { get; } + } + public class DistributedTransactionOperationResult<T> : DistributedTransactionOperationResult + { + protected DistributedTransactionOperationResult(); + public virtual T Resource { get; set; } + } + public class DistributedTransactionRequestOptions : RequestOptions + { + public DistributedTransactionRequestOptions(); + public string SessionToken { get; set; } + } + public class DistributedTransactionResponse : IDisposable, IEnumerable, IEnumerable<DistributedTransactionOperationResult>, IReadOnlyCollection<DistributedTransactionOperationResult>, IReadOnlyList<DistributedTransactionOperationResult> + { + protected DistributedTransactionResponse(); + public virtual string ActivityId { get; } + public virtual int Count { get; } + public virtual CosmosDiagnostics Diagnostics { get; } + public virtual string DiagnosticString { get; } + public virtual string ErrorMessage { get; } + public virtual Headers Headers { get; } + public virtual Guid IdempotencyToken { get; } + public virtual bool IsRetriable { get; } + public virtual bool IsSuccessStatusCode { get; } + public virtual DistributedTransactionOperationResult this[int index] { get; } + public virtual double RequestCharge { get; } + public virtual HttpStatusCode StatusCode { get; } + public void Dispose(); + protected virtual void Dispose(bool disposing); + public virtual IEnumerator<DistributedTransactionOperationResult> GetEnumerator(); + public virtual DistributedTransactionOperationResult<T> GetOperationResultAtIndex<T>(int index); + IEnumerator System.Collections.IEnumerable.GetEnumerator(); + } + public abstract class DistributedWriteTransaction : DistributedTransaction + { + protected DistributedWriteTransaction(); + public abstract DistributedWriteTransaction CreateItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction CreateItem<T>(Container container, PartitionKey partitionKey, string id, T resource, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction DeleteItem(Container container, PartitionKey partitionKey, string id, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction PatchItem(Container container, PartitionKey partitionKey, string id, IReadOnlyList<PatchOperation> patchOperations, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction PatchItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction ReplaceItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction ReplaceItem<T>(Container container, PartitionKey partitionKey, string id, T resource, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction UpsertItemStream(Container container, PartitionKey partitionKey, string id, Stream streamPayload, DistributedTransactionRequestOptions requestOptions=null); + public abstract DistributedWriteTransaction UpsertItem<T>(Container container, PartitionKey partitionKey, string id, T resource, DistributedTransactionRequestOptions requestOptions=null); + } public class Embedding : IEquatable<Embedding> { public Embedding(); @@ -809,6 +886,10 @@ namespace Microsoft.Azure.Cosmos IEnumerator System.Collections.IEnumerable.GetEnumerator(); public virtual bool TryGetValue(string headerName, out string value); } + public interface ICosmosEmbeddingGenerator + { + Task<CosmosEmbeddingResult> GenerateEmbeddingsAsync(IReadOnlyList<string> texts, string endpoint, string deploymentName, int dimensions, CancellationToken cancellationToken=default(CancellationToken)); + } public sealed class IncludedPath { public IncludedPath(); @@ -1157,6 +1238,28 @@ namespace Microsoft.Azure.Cosmos public const string WestUS2 = "West US 2"; public const string WestUS3 = "West US 3"; } + public struct RequestedRegion : IEquatable<RequestedRegion> + { + public RequestedRegion(string regionName, RequestedRegionReason reason); + public RequestedRegionReason Reason { get; } + public string RegionName { get; } + public bool Equals(RequestedRegion other); + public override bool Equals(object obj); + public override int GetHashCode(); + public override string ToString(); + } + public enum RequestedRegionReason : byte + { + CircuitBreakerProbe = (byte)6, + Hedging = (byte)4, + Initial = (byte)1, + OperationRetry = (byte)2, + RegionFailover = (byte)5, + TransportRetry = (byte)3, + Unknown = (byte)0, + } public abstract class RequestHandler { protected RequestHandler(); @@ -1526,6 +1629,7 @@ namespace Microsoft.Azure.Cosmos.Fluent public CosmosClientBuilder WithContentResponseOnWrite(bool contentResponseOnWrite); public CosmosClientBuilder WithCustomAccountEndpoints(IEnumerable<Uri> customAccountEndpoints); public CosmosClientBuilder WithCustomSerializer(CosmosSerializer cosmosJsonSerializer); + public CosmosClientBuilder WithEmbeddingGenerator(ICosmosEmbeddingGenerator embeddingGenerator); public CosmosClientBuilder WithEnableRemoteRegionPreferredForSessionRetry(bool enableRemoteRegionPreferredForSessionRetry); public CosmosClientBuilder WithFaultInjection(IFaultInjector faultInjector); public CosmosClientBuilder WithHttpClientFactory(Func<HttpClient> httpClientFactory); ``` ### Checklist - [X] Changelog entries reviewed by team - [ ] API contract diff reviewed by Kiran and Kirill - [ ] Preview APIs reviewed (email sent to azurecosmossdkdotnet@microsoft.com) - [ ] Kiran sign-off obtained --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Changes the
#if INTERNALpreprocessor directive to#if PREVIEWacross all distributed transaction public-facing types and factory methods so they are exposed in preview builds.Changes
DistributedTransaction,DistributedReadTransaction,DistributedWriteTransaction— class visibilityDistributedTransactionResponse,DistributedTransactionOperationResult,DistributedTransactionOperationResult<T>— class visibilityDistributedTransactionRequestOptions— class visibilityCosmosClient.CreateDistributedWriteTransaction()/CreateDistributedReadTransaction()— method visibilityType of change
Please delete options that are not relevant.
Closing issues
To automatically close an issue: closes #IssueNumber
Changelog
### Unreleasedinchangelog.mdfor the user-facing impact of this change.
documentation-only, test-only, CI / build-only, or a pure internal refactor
with no observable customer impact.