Я создал простой CRUD API, используя Spring Data JPA в моем загрузочном приложении Spring. Метод My 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 как Idempotent, чтобы даже если я снова получил полезную нагрузку json с тем же article_identifier
, он не создал бы запись в БД.
Я не могу изменить схему/ограничение в базе данных, а поле article_identifier
также не является первичным ключом в таблице.
Я понимаю, что сначала я могу проверить базу данных и вернуть сохраненную запись в ответ, если она уже существует, но здесь, если одновременно поступает несколько запросов (исходный и дублирующий запрос), оба будут проверять базу данных и не найдут записи с этим идентификатором и создаст 2 записи (по одной на каждую). Кроме того, поскольку это распределенное приложение, как я могу поддерживать согласованность между несколькими транзакциями базы данных.
Как я могу использовать какой-то механизм блокировки, чтобы никогда не было 2 записей с одинаковыми article_identifier
. Может кто-нибудь предложить несколько ссылок, как реализовать это в Spring boot?
article_identifier
первичным ключом в базе данных? - person Kavithakaran Kanapathippillai   schedule 20.07.2020GET
,PUT
иDELETE
должны быть идемпотентными. Выполнение этого сPOST
может запутать потребителя API. - person Aleksandr Erokhin   schedule 24.12.2020