Cosmos DB SQL API - 乐观并发控制 - etag的用法

Cosmos DB SQL API - Optimistic concurrency control - usage of etag

我正在使用 CosmosRepository(不是 ReactiveCosmosRepository)并且我想使用“_etag”处理并发 属性。 我将“_etag”属性 添加到我的文档中:-

class User {

@Id
private String id;

@JsonProperty("_etag")
private string tag;
}

当我执行以下操作时:

document.setTag("ABCD");
repository.save(document)

cosmos db 中的文档如下所示:-

{
 "id" : " some random uuid ",
 "_etag" : " again some random uuid",
 "_ts" : "123123123"
 "_rid": "random string"
 "_self": "again random strings"
 "_attachments" : "attachments/"
}

但是 我期待 _etag 看起来像 :

{
...
 "_etag" : "ABCD" 
...
}

因为我做到了document.setTag("ABCD")

当我使用数据库生成的 _etag 并将其添加到我的 PUT 方法中(显然是为了更新记录)时,即使标签不匹配,保存(更新)也是成功的。

我需要额外的配置吗?带有文档中定义的 etag 字段的简单 repository.save() 是否足够?

您无法在 Cosmos DB 中主动设置 etag 的值。这是自动为您处理的。您只需插入、替换或更新插入项目即可设置。

https://github.com/Azure-Samples/azure-cosmos-java-sql-api-samples/blob/master/src/main/java/com/azure/cosmos/examples/documentcrud/sync/DocumentCRUDQuickstart.java#L210

Jcoder,您使用上述示例作为解决方案的基础是正确的。

Spring 数据 Azure Cosmos DB 建立在 Azure Cosmos DB Java SDK 之上,这是 CosmosClient 的来源。我了解,您正在尝试在不直接使用 Java SDK 和 CosmosClient 的情况下完成上述操作。但实际上这就是我们建议您做的。在 pom.xml 中确保同时引入 Spring Data Azure Cosmos DB 和 Azure Cosmos DB Java SDK。

有关同时使用 Spring 数据连接器和底层 Java SDK 的另一个示例,请参阅此 link

中的“自定义查询执行”

https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/how-to-guides-spring-data-cosmosdb