Spring boot Cosmos DB SQL API-乐观并发控制-etag的使用
我使用的是CosmosRepository而不是ReactiveCosmosRepository,我希望使用_etag属性处理并发性。 我将_etag属性添加到我的文档中,如下所示:-Spring boot Cosmos DB SQL API-乐观并发控制-etag的使用,spring-boot,azure-cosmosdb-sqlapi,Spring Boot,Azure Cosmosdb Sqlapi,我使用的是CosmosRepository而不是ReactiveCosmosRepository,我希望使用_etag属性处理并发性。 我将_etag属性添加到我的文档中,如下所示:- class User { @Id private String id; @JsonProperty("_etag") private string tag; } 当我执行以下操作时: document.setTag("ABCD"); repository.save(d
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" : "ABCD"
...
}
因为我做了document.setTagABCD
当我获取db生成的_etag并将其添加到我的PUT方法中以更新记录时,saveupdate成功了,即使标记不匹配
我需要额外的配置吗?文档中定义的简单repository.save with etag字段就足够了吗?您不能在Cosmos DB中主动设置etag的值。这是自动为您处理的。您只需插入、替换或向上插入要设置的项。您无法在Cosmos DB中主动设置etag的值。这是自动为您处理的。只需插入、替换或向上插入要设置的项即可 Jcoder使用上述示例作为解决方案的基础是正确的 Spring数据Azure Cosmos DB构建在Azure Cosmos DB Java SDK之上,后者是CosmosClient的来源。我理解,您试图在不直接使用JavaSDK和CosmosClient的情况下完成上述任务。但实际上这就是我们建议你做的。在pom.xml中,确保同时拉入Spring数据Azure Cosmos DB和Azure Cosmos DB Java SDK 有关同时使用Spring数据连接器和底层Java SDK的另一个示例,请参见此链接中的自定义查询执行 Jcoder使用上述示例作为解决方案的基础是正确的 Spring数据Azure Cosmos DB构建在Azure Cosmos DB Java SDK之上,后者是CosmosClient的来源。我理解,您试图在不直接使用JavaSDK和CosmosClient的情况下完成上述任务。但实际上这就是我们建议你做的。在pom.xml中,确保同时拉入Spring数据Azure Cosmos DB和Azure Cosmos DB Java SDK 有关同时使用Spring数据连接器和底层Java SDK的另一个示例,请参见此链接中的自定义查询执行
嗨,马克,我指的是本文件的第4段:。正是这句话:每次更新项目时,项目的_etag值都会更改。对于替换项操作,如果匹配必须明确表示为请求选项的一部分,文档进一步说明:如果检测到任何冲突,存储过程将回滚事务并引发异常。。。。。。。。这是向应用程序发出的重新应用更新并重试原始客户端请求的信号。因此,您是说etag处理是在内部完成的,不可在我的应用程序中进行配置?您需要配置的唯一一件事是在请求选项中指定它匹配,如果它匹配,则更新将起作用。如果没有,它将引发异常,使您有机会再次获取项目,再次应用更新,然后重试更新。因此,我应该使用此处提到的ReplaceDocumentWithConditionalTagCheck而不是repository.save?:嗨,马克,我指的是本文件的第4段:。正是这句话:每次更新项目时,项目的_etag值都会更改。对于替换项操作,如果匹配必须明确表示为请求选项的一部分,文档进一步说明:如果检测到任何冲突,存储过程将回滚事务并引发异常。。。。。。。。这是向应用程序发出的重新应用更新并重试原始客户端请求的信号。因此,您是说etag处理是在内部完成的,不可在我的应用程序中进行配置?您需要配置的唯一一件事是在请求选项中指定它匹配,如果它匹配,则更新将起作用。如果没有,它将引发异常,使您有机会再次获取项目,再次应用更新,然后重试更新。因此,我应该使用此处提到的ReplaceDocumentWithConditionalTagCheck而不是repository.save?:通过传递etag值,并使用@Version进行注释,这对我们很有用。如果etag匹配,则更新文档。否则,它会异常失败。感谢您提供这些文档的链接。它通过传递etag值和使用@Version进行注释为我们提供了帮助。如果etag匹配,则更新文档。否则,它会异常失败。感谢您提供这些文档的链接。