JPA: ApplicationManaged EntityManager для Java SE для программного управления жизненным циклом транзакций.

У меня возникли трудности с поиском хорошего решения для поддержки этой функции, когда пользовательский интерфейс может запускать и фиксировать транзакцию.

В моих предыдущих подходах к работе с транзакционными приложениями я группировал единицу работы в сервисный метод в бэкенде и аннотировал его с помощью Spring @Transactional.


Но представьте, что у меня есть несколько подобных сервисных методов, и внешний интерфейс должен сгруппировать вызовы сервисных методов внутри транзакции.

Например, у меня есть methodServiceA, methodServiceB, methodServiceC. Пользовательский интерфейс может сделать что-то подобное с любыми комбинациями, такими как:

Комбинация 1:

  1. начинает транзакцию
  2. вызов методаServiceA + вызов методаServiceB
  3. совершает транзакцию

Комбинация 2:

  1. начинает транзакцию
  2. вызов методаServiceB + вызов методаServiceC
  3. совершает транзакцию

Комбинация 3:

  1. начинает транзакцию
  2. вызов методаServiceA + вызов методаServiceB + вызов методаServiceC
  3. совершает транзакцию

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


Так что это в основном ситуация, с которой я имею дело ... и вот что я имею в виду. Пожалуйста, поделитесь некоторыми другими вариантами или, возможно, улучшениями, которые я мог бы сделать для поддержки этой функции. В настоящее время я думаю об использовании менеджера сущностей, управляемого приложением, так как я не думаю, что использование @Transactional будет работать в этом случае.

Я думаю об объекте, который пользовательский интерфейс или другие соединители могли бы использовать для:

  1. создать менеджер сущностей и связать его с уникальным идентификатором
  2. начать транзакцию с em
  3. установить тайм-аут от em
  4. зафиксировать транзакцию из em
  5. автоматически откатывать транзакцию, если есть какие-либо исключения из em
  6. передает диспетчер сущностей транзакции методам службы, чтобы они использовали один и тот же диспетчер сущностей
  7. окончательно закрывает менеджер сущностей после фиксации или отката из em

Итак, для примера для Комбинации 1 поток выглядит примерно так:

  1. ui запускает транзакцию с помощью инструмента и получает идентификатор entitymanager
  2. передайте идентификатор entitymanager при вызове methodServiceA + вызове methodServiceB, чтобы эти методы могли использовать правильный диспетчер сущностей, который связан с идентификатором
  3. совершает транзакцию

Поделитесь своими мыслями по этому поводу, спасибо!


Относительно шаблона фасада/команды:

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

Основная идея состоит в том, чтобы иметь общедоступные сервисные методы, которые другие клиентские приложения могли бы связывать друг с другом.

Кроме того, использование шаблона фасада означает отсутствие логики пользовательского интерфейса в методе фасада. В нашем случае логика пользовательского интерфейса может выполняться вместе с обработкой транзакций и вызовом сервисных методов во внешнем интерфейсе.


person Albert Gan    schedule 23.02.2011    source источник


Ответы (2)


Используйте шаблон фасада: создайте сервис фасада, содержащий метод для каждой из комбинаций (который должен отображать функциональный вариант использования), и сделайте эти методы фасада транзакционными, используя аннотацию Spring. Фасадные методы будут просто вызывать существующие сервисные методы.

person JB Nizet    schedule 23.02.2011

Вы можете попробовать использовать шаблон команды — пользовательский интерфейс отправляет последовательность команд, а ваш сервер выполняет их. в одной транзакции.

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

person axtavt    schedule 23.02.2011
comment
Спасибо, я обновил свой ответ выше в нижней части. Да, я просмотрел контекст расширенного сохранения, но он доступен только в bean-компонентах с отслеживанием состояния, и я не использую bean-компоненты с отслеживанием состояния. Так что в настоящее время я склоняюсь к диспетчеру сущностей, управляемых приложением, все еще надеясь на что-то, что могло бы облегчить мою жизнь, ха-ха - person Albert Gan; 23.02.2011