Получить эксклюзивную блокировку нескольких записей с помощью JPA? - PullRequest
0 голосов
/ 10 января 2020

У меня следующая проблема: (я делаю сложный процесс с использованием EJB и JPA, мои транзакции управляются контейнером, я использую уровень изоляции Read commited)

  1. Один из моих методов в транзакция EJB обновляет таблицу пользователей (запись user_1).
  2. В той же транзакции EJB я вызываю услугу, которая занимает много времени (время ожидания 2 минуты).
  3. Во время обслуживания вызов Я пытаюсь получить запись user_2 из таблицы пользователя (это новая EJB-транзакция, новая SQL транзакция)
  4. Я могу получить запись user_2 только после завершения первого метода ( в основном 2 минуты ожидания).

Вот мой вывод: у меня есть две SQL транзакции (T1 и T2). T1 обновляет записи user_1, поэтому SQL Сервер получает эксклюзивную блокировку записи user_1. T1 не фиксируется, поскольку транзакция фиксируется только в конце метода. В течение 2-минутного периода я также проверил монитор активности SQL и увидел, что Выбор пользовательской таблицы T2 ожидал T1, и он не смог получить общую блокировку (в записи user_2). Эксклюзивная блокировка удерживается до фиксации, что объясняет это поведение. Единственный квест - почему у меня такая блокирующая ситуация, я влияю на разные записи в транзакциях? У меня есть решение этой проблемы, я только хочу знать, почему это происходит.

...