Я использую Java Spring Framework и Hibernate. Я делаю веб-приложение для электронной коммерции, где общественный пользователь может приобрести продукт из веб-приложения. Каждый продукт будет иметь количество.
вопрос
Я хочу, чтобы предотвратить сценарий, когда два параллельных пользователя покупают один и тот же продукт, остается с количественным значением 1. В этом случае только первый пользователь должен получить покупку продукта, в то время как второй пользователь должен получить сообщение "без акций".
Workflow
Я намерен уменьшить количество количества, а затем отправить информацию о покупке на платежный шлюз. Если платежный шлюз столкнется с проблемой оплаты, я увеличу количество счетчиков. Блокировка будет освобождена до того, как информация о покупке будет отправлена на платежный шлюз.
Поэтому мой вопрос:
1) Я хотел бы подтвердить, что этот ответ на пессимистическую блокировку помогает решить мою проблему.
2) Хорошо ли работает мой рабочий процесс? Есть лучший способ сделать это?
Вы также можете использовать оптимистичную блокировку и предотвращать возможные потерянные обновления.
С оптимистичной блокировкой, если два пользователя загрузили один и тот же объект со стеком одного, а один пользователь только что совершил покупку и уменьшил счетчик, тогда второй пользователь не сможет ОБНОВИТЬ продукт продукта, так как его версия продукта не соответствует той, которая найдена в базе данных (которая была увеличена первым пользователем).
При любом исключении (StaleStateException) текущая транзакция откатывается назад, и никакие изменения не применяются к базе данных (например, добавление OrderLine против продукта с нулевым количеством).
Оптимистический подход к блокировке масштабируется лучше, чем пессимистическая блокировка, а также работает с многопользовательскими логическими транзакциями.