Блокировки транзакций EJB / уровни изоляции Hibernate - PullRequest
0 голосов
/ 11 октября 2018

У меня есть веб-сервис, который производит много обновлений в моей базе данных.После этого он будет выполнять некоторые другие действия (например, исчисление, вызов другого веб-сервиса и т. Д.).В конце он снова связывается с базой данных.

Проблема заключается в том, что таблицы заблокированы в течение всего срока службы веб-службы.Поэтому, если «другие вещи» занимают больше времени, я не могу работать с таблицами в это время.

Существует способ заблокировать только регистр, а не таблицы?

Как можноЯ избегаю этой ситуации?

Я использую Hibernate и MYSQL.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Книга Pro JPA 2 гласит:

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

, поэтому я предлагаю вам еще раз подумать о своей потребности.

Я использую PESSIMISTIC_WRITE

Гибернация получает эксклюзивные блокировки с помощью 'Операторы SELECT… FOR UPDATE '(при использовании пессимистической блокировки)

4: Connection.TRANSACTION_REPEATABLE_READ блокирует выбранные данные (во время транзакции).так что вам не нужно использовать pessimistic_lock.пессимистическая блокировка обычно используется для repeatateabe_read, в то время как изоляция транзакции не повторяется_read (когда Read Committed)

следующие ссылки описывают механизм блокировки mysql

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html#isolevel_repeatable-read

Есть способ заблокировать только регистр, а не таблицы?

выбранная строка должна быть заблокирована, а не таблицы (проверьте выбор)

0 голосов
/ 11 октября 2018

Какой уровень изоляции транзакций вы используете?Пожалуйста, обратитесь к документации , чтобы увидеть, как это влияет на блокировку и как это можно изменить.

Проверьте ваше приложение.Транзакции должны быть максимально короткими.Рассмотрим редизайн, если это необходимо.Вы можете даже рассмотреть возможность использования BASE вместо ACID .

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