Проблема с использованием гибернации в JVMS

#hibernate

#гибернация

Вопрос:

Мое приложение выполняет вызовы на сервер, который кластеризован в 2 JVMS. Запросы могут направляться на любой из серверов. Я использую Spring с гибернацией для вызовов DB (для базы данных DB2). Однако я заметил, что нет механизма автоматической блокировки из режима гибернации в JVMS. Я реализовал механизм блокировки с помощью чего-то вроде — query.setLockMode («myBo», LockMode.ОБНОВЛЕНИЕ); Но, похоже, это не работает в JVMS.

Сценарий проблемы:

Сначала JVM выбирает данные для обновления (с LockMode.ОБНОВЛЕНИЕ на месте) из Table1. Прежде чем первая JVM завершит обновление, вторая JVM также выберет данные из Table1 (чего не должно произойти). Первая JVM успешно завершает обновление. Но вторая JVM завершается с ошибкой (происходит обновление индексного ключа для Table1) с исключением DuplicateKeyException.

Кто-нибудь, пожалуйста, может предложить решение для этого?

Спасибо, Радхика

Комментарии:

1. Вторая транзакция также выбирает данные с LockMode.UPGRADE ? Выбирает ли вторая транзакция те же данные, что и первая?

Ответ №1:

Это не связано с тем, что у вас несколько JVM. У вас мог бы быть тот же сценарий с двумя параллельными потоками на одной JVM, потому что Hibernate вообще не выполняет никакой блокировки. Если вам нужна блокировка, то используйте оптимистичные блокировки (используя атрибут version) или используйте блокировки в базе данных (с LockMode.ОБНОВЛЕНИЕ).

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

Комментарии:

1. Спасибо за ваш ответ. Придется реализовать некоторую логику обработки ошибок / исключений для одновременного доступа к данным, поскольку блокировка гибернации не действует.