Как освободить заблокированную строку с помощью JPA? - PullRequest
5 голосов
/ 03 марта 2010

Я использую реализацию EclipseLink JPA 2.0, которая позволяет пессимистическую блокировку. Я знаю, как заблокировать объект, но как снять блокировку? Сначала я подумал, что об этом все позаботились внутри транзакции (другими словами, объект заблокирован до тех пор, пока вы не совершите транзакцию), но, похоже, это не так.

Я пробовал быстрый поиск в Google (кажется, это должно быть довольно очевидно), но я ничего не нашел ...

1 Ответ

9 голосов
/ 03 марта 2010

После того, как я немного поспал ... и утром провел еще какое-то тестирование, мне кажется, я понял свою проблему. Таким образом, блокировка фактически выполняется в рамках транзакции. Однако, когда я тестировал свой код, я смог получить заблокированную строку, используя метод EntityManager.find (Class, key) (стратегия блокировки не указана). Я ошибочно думал, что, установив блокировку строки, строка не может быть прочитана. Период. Однако я перечитал JPA-определения PESSIMISTIC_READ и PESSIMISTIC_WRITE и заметил мою проблему:

PESSIMISTIC_READ - Объект заблокирован в базе данных, запрещает любой другой транзакции получить блокировку PESSIMISTIC_WRITE. PESSIMISTIC_WRITE - Объект заблокирован в базе данных, запрещает любой другой транзакции получить блокировку PESSIMISTIC_READ или PESSIMISTIC_WRITE.

Блокировка не обязательно предотвращает все чтения, она просто запрещает другой транзакции поставить блокировку READ или WRITE в строку.

...