Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126
PostgreSQL

Hibernate взаимная блокировка нескольких потоков

05.09.2022, 14:48. Показов 1301. Ответов 2

Студворк — интернет-сервис помощи студентам
Итак, значит, имею небольшой тестовый проектик на Java и Hibernate, несколько потоков, все изменяют одну и ту же таблицу.
Использую пессимистическую блокировку. Вот проблемный участок кода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   public void run() {
        System.out.printf("Thread for user %s run", user.getName());
        Session session = sessionFactory.openSession();
        for (int i = 0; i < 1000; i++){
            Transaction transaction = session.beginTransaction();
            Long randomLotId = getRandomLotId();
            Lot lot = session.get(Lot.class, randomLotId, LockMode.fromJpaLockMode(LockModeType.PESSIMISTIC_WRITE));//исключение тут
            lot.setCurrentRate(lot.getCurrentRate()+100);
            lot.setLastOwner(user);
            transaction.commit();
            try {
                sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        session.close();
        countDownLatch.countDown();
    }
Это метод run из унаследованного от класса Thread класса UserThread.
При запуске 8 потоков параллельно, я получаю:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
сент. 05, 2022 3:40:11 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 40P01
сент. 05, 2022 3:40:11 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ОШИБКА: обнаружена взаимоблокировка
  Подробности: Процесс 21301 ожидает в режиме ShareLock блокировку "транзакция 77116"; заблокирован процессом 21288.
Процесс 21288 ожидает в режиме ShareLock блокировку "транзакция 77111"; заблокирован процессом 21301.
  Подсказка: Подробности запроса смотрите в протоколе сервера.
  Где: при блокировке кортежа (4,33) в отношении "lots"
сент. 05, 2022 3:40:11 PM org.hibernate.event.internal.DefaultLoadEventListener doOnLoad
INFO: HHH000327: Error performing load command
org.hibernate.dialect.lock.PessimisticEntityLockException: could not obtain pessimistic lock
    at org.hibernate.dialect.lock.PessimisticWriteSelectLockingStrategy.lock(PessimisticWriteSelectLockingStrategy.java:101)
    at org.hibernate.persister.entity.AbstractEntityPersister.lock(AbstractEntityPersister.java:2235)
    at org.hibernate.loader.ast.internal.LoaderHelper.upgradeLock(LoaderHelper.java:68)
    at org.hibernate.event.internal.AbstractLockUpgradeEventListener.upgradeLock(AbstractLockUpgradeEventListener.java:35)
    at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:80)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)
    at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:704)
    at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:693)
    at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2155)
    at org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.lambda$new$0(DeferredResultSetAccess.java:122)
    at org.hibernate.sql.exec.internal.CallbackImpl.invokeAfterLoadActions(CallbackImpl.java:37)
    at org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl.lambda$postLoad$0(JdbcValuesSourceProcessingStateStandardImpl.java:214)
    at java.base/java.util.HashMap.forEach(HashMap.java:1421)
    at org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl.postLoad(JdbcValuesSourceProcessingStateStandardImpl.java:202)
    at org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl.finishUp(JdbcValuesSourceProcessingStateStandardImpl.java:191)
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:149)
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:32)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:437)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:166)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:91)
    at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31)
    at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:140)
    at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:110)
    at org.hibernate.loader.ast.internal.SingleIdEntityLoaderStandardImpl.load(SingleIdEntityLoaderStandardImpl.java:72)
    at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4322)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4312)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:598)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:571)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:223)
    at org.hibernate.event.internal.DefaultLoadEventListener.lockAndLoad(DefaultLoadEventListener.java:507)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:115)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118)
    at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1241)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1229)
    at org.hibernate.loader.access.IdentifierLoadAccessImpl.doLoad(IdentifierLoadAccessImpl.java:182)
    at org.hibernate.loader.access.IdentifierLoadAccessImpl.lambda$load$1(IdentifierLoadAccessImpl.java:158)
    at org.hibernate.loader.access.IdentifierLoadAccessImpl.perform(IdentifierLoadAccessImpl.java:105)
    at org.hibernate.loader.access.IdentifierLoadAccessImpl.load(IdentifierLoadAccessImpl.java:158)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:1158)
    at threadprocessing.UserThread.run(UserThread.java:36)
Я прикрепил полный архив с проектом, он на maven.
Там есть два файла .sql, один из них создаёт таблицы, а второй наполняет их.
Вложения
Тип файла: zip HibernatePartTwoHomework.zip (60.5 Кб, 0 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.09.2022, 14:48
Ответы с готовыми решениями:

Почему происходит взаимная блокировка потоков?
Код из Гербердта Шилдта, глава 11, класс Deadlock // An example of deadlock. class A { synchronized void foo(B b) { String...

Не срабатывает взаимная блокировка
Изучаю многопоточность при запуски данного кода, всегда выводится два потока, компилятор никогда не блокируется,

Многопоточность Java (Взаимная блокировка)
Есть пример public class Student { private ArrayList friends = new ArrayList(); public synchronized ArrayList getFriends() ...

2
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126
05.09.2022, 14:58  [ТС]
Если что, то проект совсем маленький, там всего 5 основных файла не длиннее 50 строк кода
0
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126
09.09.2022, 15:41  [ТС]
Экспериментальным путём, было выяснено, что взаимную блокировку вызывает поле lastOwner в классе Lot, но я все равно не понимаю почему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2022, 15:41
Помогаю со студенческими работами здесь

Взаимная блокировка потоков
В одной из моих программ, наблюдается взаимная блокировка потоков. Судя по всему это происходит из-за обращения к SysListView32 из...

Взаимная блокировка Java
Задание: Разработать программу, которая позволяла бы работать с тремя файлами. Исходная информация должна хранить в файле file1.txt...

Взаимная блокировка транзакций
Здравствуйте! Можно ли каким-либо образом на одном компьютере запустить две транзакции, которые будут блокировать друг друга?

Мьютексы, взаимная блокировка процессов
процесс1 два раза посылает данные процессу2 на обработку while(i!=2) { pthread_mutex_unlock(mptr); ...

Не понимаю вырезку из книги (Взаимная блокировка)
Читаю книгу Энтони Уильямся &quot;Паралельное программирование на С++&quot;. Но я не совсем понимаю следующий кусок (на картинке). Я понимаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru