2015-02-25 2 views
0

Что является наиболее подходящим способом обработки оптимистической блокировки в jpa. У меня есть решения ниже, но не знаю, как лучше это использовать.Как справиться с оптимистичным исключением блокировки в jpa

  1. Обработка исключая оптимистичную блокировку в блокировке catch и повторную попытку.
  2. Используя флаг Atomic variable и проверяя, обрабатывается ли его обработка, подождите, пока другой поток завершит обработку. Таким образом можно избежать модификации данных или блокировки.
  3. Поддержание очереди всех входящих запросов на изменение базы данных и обработка их по одному.

Любой, пожалуйста, предложите мне, если есть лучшее решение этой проблемы.

+0

Это не так просто. Это полностью зависит от того, что вы делаете. – Kayaman

ответ

1

Вы не говорите, почему используете оптимистичную блокировку.

Вы обычно используете его, чтобы избежать блокировки ресурсов (например, строк базы данных) в течение длительного времени, то есть данные считываются из базы данных и отображаются пользователю. В конце концов пользователь вносит изменения в базу данных, и данные записываются обратно.

Вы не хотите блокировать данные для других пользователей за это время. В подобном сценарии вы не хотите использовать вариант 2 по той же причине.

Вариант 1 нелегкий, поскольку исключение с оптимистичной блокировкой говорит вам, что что-то изменило данные за вашей спиной, и вы заменили эти изменения своими данными. Повторная попытка записи данных здесь не поможет.

Вариант 3 может быть возможен в некоторых ситуациях, но добавляет много сложности и возможных ошибок. Это было бы моим последним прибежищем.

По моему опыту оптимистичные блокирующие исключения встречаются довольно редко. В большинстве случаев самый простой выход - это отбросить все и повторить его с самого начала, даже если это означает сказать пользователю: извините, возникла неожиданная проблема, сделайте это снова.

С другой стороны, если вы регулярно сталкиваетесь с этими проблемами, между двумя конкурирующими нитями, вы должны попытаться избежать этого. В этих случаях вариант 2 может кстати, но это зависит от сценария.

Если конфликт возникает между взаимодействием пользователя и фоновым потоком (а не между двумя пользователями), вы можете попытаться изменить время фонового потока или указать фоновый поток, чтобы задержать его работу.

Подводя итог: это в основном зависит от вашей установки и того, когда и как происходит исключение.

+0

Я получаю вызовы от внешней системы для изменения данных в моей системе. Поэтому внешняя система продолжает посылать мне запрос на мой контроллер отдыха, и я сохраняю уважаемое состояние в своей системе. Теперь когда-то два потока конкурируют друг с другом, и они заканчивают оптимистичное исключение блокировки. – Brijesh

+0

Это не похоже на сценарий, в котором я бы использовал оптимистичную блокировку. Заблокируйте данные, которые вы хотите изменить, когда вы их читаете. (Я не знаком с JPA, в чистом SQL я бы сделал SEECT FOR UPDATE). Если вам нужно заблокировать несколько строк, попробуйте заблокировать их в предопределенном порядке, чтобы предотвратить взаимоблокировки. –

Смежные вопросы