【发布时间】:2020-11-10 01:39:54
【问题描述】:
我在我的 Spring 启动应用程序中使用 Spring Data JPA 创建了简单的 CRUD api。我在控制器中的 Post 方法如下所示:-
@RequestMapping(value = "/article", method = RequestMethod.POST, produces = "application/json")
public Article createArticle(@RequestBody Article article) {
return service.createArticle(article);
}
服务方法如下:-
@Override
public Article createArticle(Article articleModel) {
return repository.save(articleModel);
}
我的 JsonPayload 如下所示:
{
"article_nm":"A1",
"article_identifier":"unique identifier"
}
现在我想将我的 POST 请求设为幂等,这样即使我再次获得具有相同 article_identifier 的 json 有效负载,它也不会在 DB 中创建记录。
我无法在数据库中进行任何方案/约束更改,article_identifier 字段也不是表中的主键。
我知道首先我可以签入数据库并返回已保存的记录作为响应,如果它已经存在,但是如果多个请求(原始请求和重复请求)同时出现,两者都会签入数据库并且找不到任何记录使用该标识符并将创建 2 条记录(每条记录)。此外,由于它是一个分布式应用程序,我如何保持多个数据库事务之间的一致性。
我怎样才能使用一些锁定机制,这样就不会有 2 条具有相同 article_identifier 的记录。有人可以建议一些参考如何在 Spring boot 中实现它吗?
【问题讨论】:
-
article_identifier是数据库的主键吗? -
@kavithakaran 不,不是。我已经在我的帖子中提到过。
-
与问题无关,但请注意,在 REST 架构中,
GET、PUT和DELETE是幂等的。使用POST这样做可能会使 API 使用者感到困惑。
标签: spring-boot post locking idempotent sql-server-2019