JPA логика пессимистичной блокировки для клиент-серверного приложения - PullRequest
0 голосов
/ 04 июля 2019

Я изучаю JPA пессимистическую блокировку. Я нашел следующее объяснение

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

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

Если я правильно понимаю, тогда, если у нас есть три пользователя (A, B, C) и пользователь A получает блокировку READ, тогда пользователь B также может получить блокировку READ, но пользователь C не может получить блокировку WRITE, пока пользователи A и B отпускает свои замки. И если пользователь A получает блокировку WRITE, то пользователь B и пользователь C не могут получить ничего, пока пользователь A не снимет блокировку.

Однако для моего клиент-серверного приложения мне нужна следующая логика. Если пользователи хотят только прочитать объект, откройте его в режиме READ-ONLY (неограниченное количество пользователей может сделать это одновременно). Если какой-то пользователь хочет отредактировать объект, он открывает его в режиме WRITE - никто не может открыть этот же объект в режиме WRITE (пока пользователь не снимет блокировку WRITE), но все остальные могут открыть объект в режиме READ-ONLY.

И у меня два вопроса:

  1. Правильно ли я понимаю пессимистическую блокировку JPA?
  2. Можно ли заставить JPA выполнять необходимую мне логику (используя механизмы блокировки JPA)?

1 Ответ

0 голосов
/ 05 июля 2019

Правильно ли я понимаю пессимистическую блокировку JPA?

Да, именно так работает блокировка чтения / записи

... но все остальные могут открывать сущность в режиме READ-ONLY

Я не совсем уверен, что вы имеете в виду. Мы все еще говорим о нескольких транзакциях, выполняющихся одновременно, верно (у меня странное ощущение, что вы не это имеете в виду)? Если это так, то в вашей логике удержание блокировки «READ_ONLY» ничего не дает.

Блокировка означает «Я замораживаю этот ресурс, чтобы некоторые другие транзакции не могли продолжаться, пока я не закончу». Но в логике, которую вы описали, когда вы удерживаете блокировку READ_ONLY, транзакция, удерживающая блокировку READ_ONLY, и транзакция, удерживающая блокировку WRITE, могут продолжаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...