Блокировка потока заблокирована в транзакции Hibernate

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

Некоторый контекст: первый процесс создает объект, запускает второй процесс на внешнем компьютере и устанавливает статус объекта в STARTED. Второй процесс на внешнем компьютере выполняет вызов веб-службы, и эта веб-служба находит объект и обновляет статус объекта до READY. Первый процесс имеет цикл, который проверяет состояние объекта, и после того, как он был изменен с НАЧАЛО на ГОТОВО, он выполняет дополнительную обработку и завершается. Однако второй процесс никогда не сможет найти объект (я думаю), поскольку он никогда не фиксируется из сеанса Hibernate, где он был создан в первом процессе, который не завершился к тому времени, когда второй процесс пытается найти объект.

Как лучше сделать, чтобы такого не было? Есть ли способ зафиксировать транзакцию на полпути, непосредственно перед запуском второго процесса, чтобы сущность присутствовала в базе данных для поиска вторым процессом?

Спасибо за ваши предложения и т.д.


person James Adams    schedule 18.12.2009    source источник


Ответы (1)


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

person David M    schedule 18.12.2009
comment
Я очищаюсь после создания исходного объекта, но один и тот же сеанс не используется двумя процессами, которые обращаются к базе данных, и кажется, что до тех пор, пока транзакция первого процесса не завершится, объект не сохраняется и не доступен для второго процесса. - person James Adams; 18.12.2009
comment
Это то, чего вы ожидаете от транзакции, не так ли? - person David M; 18.12.2009
comment
Я имею в виду, что объект не будет виден за пределами транзакции до тех пор, пока транзакция не будет зафиксирована (если вы не настроите соответствующим образом уровень изоляции транзакции). Вам нужно будет зафиксировать после шага 1 из 3. - person David M; 18.12.2009