Как заблокировать (мьютекс?) Определенные записи БД в Hibernate? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть Транзакция и Экспорт сущностей. Мой контроллер имеет конечную точку / export , которая принимает набор идентификаторов транзакций, а затем создает объект экспорта с файлом .xml (который содержит данные транзакций) исохраняет его в БД. Проблема заключается в том, что Транзакция может быть назначена только одному Экспорту (и данные не могут быть дублированы в файле XML).

Итак - когда 2 пользователя отправляют 2 запроса с одним и тем же идентификатором, одна и та же транзакция будет назначена для 2 сгенерированного экспорта.

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

  1. Второй пользователь должен дождаться полного процесса операции (который может занять некоторое время), чтобы получить информацию о том, что операция была отменена.
  2. Внутри метода «generate» я должен отправить запрос во внешнюю службу, которая записывает мои операции (служба не моя). Итак, когда начинается любая операция - ее не нужно откатывать.

Меня немного спасает то, что генерация экспорта не является обычной операцией, поэтому я нашел идею:
- Давайте создадим двоичный семафор , заблокируем при появлении первого запроса и при появлении второго, вызовем tryAcquire () , чтобы проверить, могу ли я его сгенерировать - когда нет- немедленно возвращается ответ. Пользователь не должен был ждать.

В этом решении есть 2 проблемы (которые СЕЙЧАС не являются для меня проблемой, но кто знает, каким будет будущее):

  • Блокировать целую / конечную точку экспорта - даже когда 2 запросанаборы идентификаторов не рассматриваются.
  • Работает только на одном запущенном процессе. Когда я запускаю второе приложение - все провалится. Итак, может быть, есть решение по блокировке БД?
...