Как убедиться в отсутствии условий гонки в операторе обновления базы данных с использованием Spring - PullRequest
2 голосов
/ 17 апреля 2019

Представьте, что есть две сущности Children и Gifts.Допустим, есть 1000 детей и 10 подарков.Дети всегда будут пытаться захватить имеющиеся подарки, и подарки будут помечаться для детей по принципу «первым пришел - первым обслужен».

Структура таблицы

children таблица

+----+------+
| id | name |
+----+------+
|  1 | Sam  |
|  2 | John |
|  3 | Sara |
+----+------+

gift таблица

+----+---------+-------------+
| id |  gift   | children_id |
+----+---------+-------------+
|  1 | Toy Car |           2 |
|  2 | Doll    |           3 |
+----+---------+-------------+

Здесь children_id - это ребенок, которого схватилисначала подарок.

В моем приложении я хочу обновить children_id таким образом, чтобы только первый ребенок, инициировавший запрос, получил его, а остальные получили GiftUnavailableException.

Как я могу гарантировать, что, даже если за один раз приходит 1000 запросов на получение определенного подарка, только первый получит его.Или как я могу убедиться, что в этом обновлении нет условий гонки.

Есть ли какая-либо особенность пружины, которую я могу использовать, или есть какие-либо другие способы.

Я используюпружинный ботинок как мой бэкэнд.

1 Ответ

0 голосов
/ 17 апреля 2019

Я не могу оставить комментарий, так что я иду!

Я предполагаю, что вы используете Spring Data JPA.

Тогда вы должны использовать @Transactional аннотацию: это означает, что каждый раз, когда вызапрашиваете базу данных, вы совершаете транзакцию:

  1. Начало транзакции
  2. Выполнение транзакции
  3. Подтверждение транзакции

Много полезной информацииоб этом (Прочтите !!): Spring @Transactional - изоляция, распространение

Вам нужно будет заполнить вашу Transactional Isolation до Serializable и, возможно, изменить метод распространения.

И если вы не используете Spring-данные JPA .. Ну, есть синхронизированные ключевые слова, но я думаю, что это немного ужасно использовать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...