Hibernate, проблема транзакции Spring Web Service - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть два приложения. Один - это OrderService, а другой - TradeService. В торговом сервисе есть метод «Купить», который является транзакционным.

Проблема возникает, когда Торговая служба вызывает метод SubmitOrder для службы заказов с использованием веб-службы.

Описание проблемы:

  1. Все шаги в методе Buy осуществляются в рамках одной транзакции.

  2. Когда мы вызываем метод покупки, он создает один объект ордера.

  3. Когда этот метод вызывает метод Submit Order с помощью веб-службы, он передает идентификатор заказа.

  4. Метод отправки заказа использует этот идентификатор для загрузки объекта заказа из БД.

  5. Но в методе Load Это дает Lazy Initialization Exception: Сессия закрыта. (Оба приложения совместно используют одну и ту же базу данных)

  6. Вероятное решение этой проблемы - сделать способ отправки заказа транзакционным.

  7. Это приводит к еще одной проблеме тупика.

    • причина тупика, A. Купить метод Locks Order Object с идентификатором 'xyz'. и отправляет тот же идентификатор для отправки метода заказа. B. Теперь метод Buy ожидает ответа от отправки заказа. C. Метод отправки заказа не может загрузить объект заказа, так как он уже заблокирован методом покупки. D. Итак, метод Submit Order ожидает получения блокировки. Следовательно, это состояние мертвой блокировки.

Примечание. Оба приложения используют Spring MVC, Spring Web Service и Hibernate.

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

Ответы [ 2 ]

0 голосов
/ 12 мая 2011

Почему TradeService создает заказ?Я ожидаю, что это будет ответственность OrderService.Таким образом, нет конкуренции и за один и тот же ресурс.

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

0 голосов
/ 15 апреля 2011

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

Таким образом, вы должны учитывать тот факт, что у вас есть две транзакции базы данных.По одному на каждую сторону.- И в дополнение к этому (что вызывает исключение Lazy Initialization), если веб-служба - на стороне сервера получает объект, он не присоединяется ни к какому сеансу, поэтому, если вы пытаетесь получить доступ к еще не загруженному (layz загруженному) свойствузатем получите это исключение загрузки layz.

Вам нужно открыть транзакцию и сначала присоединить объект к этой транзакции.

...