Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Cosmos DB SQL API-乐观并发控制-etag的使用_Spring Boot_Azure Cosmosdb Sqlapi - Fatal编程技术网

Spring boot Cosmos DB SQL API-乐观并发控制-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

我使用的是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" : "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匹配,则更新文档。否则,它会异常失败。感谢您提供这些文档的链接。