Как освободить заблокированную строку с помощью JPA?
Я использую реализацию EclipseLink JPA 2.0, которая позволяет пессимистическую блокировку. Я знаю, как заблокировать объект, но как снять блокировку? Сначала я подумал, что об этом все позаботились внутри транзакции (другими словами, объект заблокирован до тех пор, пока вы не совершите транзакцию), но, похоже, это не так.
Я пробовал быстрый поиск в Google (кажется, это должно быть довольно очевидно), но я ничего не нашел...
1 ответ
После того, как я немного поспал... и утром провел еще какое-то тестирование, мне кажется, я понял свою проблему. Таким образом, блокировка фактически выполняется в рамках транзакции. Однако, когда я тестировал свой код, я смог получить заблокированную строку, используя метод EntityManager.find(Class, key) (стратегия блокировки не указана). Я ошибочно думал, что, установив блокировку строки, строка не может быть прочитана. Период. Тем не менее, я перечитал определения JPA PESSIMISTIC_READ и PESSIMISTIC_WRITE и заметил мою проблему:
PESSIMISTIC_READ - Объект заблокирован в базе данных, не позволяет любой другой транзакции получить блокировку PESSIMISTIC_WRITE. PESSIMISTIC_WRITE - объект заблокирован в базе данных, не позволяет любой другой транзакции получить блокировку PESSIMISTIC_READ или PESSIMISTIC_WRITE.
Блокировка не обязательно предотвращает все чтения, она просто запрещает другой транзакции устанавливать блокировку READ или WRITE в строке.