Обновить
17
0
Андрей Гайдамака@Dross0

Java программист

Отправить сообщение

Спасибо за отличные вопросы.

Перед началом исполнения запроса нам нужно сохранить информацию о самом запросе и ключе. Если говорить о способе установки блокировки, то мы изначально создаем запись с блокировкой (она "логическая" и контролируется самим блоком), заполнив поле locked_at. Тут важно еще учесть, что на ключ в бд нужно повесить ограничение уникальности, чтобы вопрос о создании одинаковых ключей в один момент времени решала бд. Один из запросов успешно добавиться и продолжит обработку, а другой уже будет в ситуации, когда ключ с блокировкой уже есть и дальше логика как с блокировками.

Чтобы исключить ситуации когда блокировка снята, а результат не сохранен, стоит снимать блокировку только после успешного сохранения результата.

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

Ситуация когда мы успешно сохранили результат, но упали до снятия блокировки интересна и тут можно действовать по разному. Тут нужно учитывать, что блокировка чисто логическая и сам блок решает как работать с заблокированными ключами. Когда мы у себя это реализовывали, то приняли решение, что получая запрос с заблокированным ключом по которому сохранен ответ пишем в лог о том что произошла такая ситуация и возвращаем этот сохраненный ответ.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Бэкенд разработчик
Java
Spring Boot
Java Spring Framework
PostgreSQL
Английский язык
Docker
ООП
SQL
Git
Hibernate