Мне трудно найти хорошее решение для поддержки этой функции, где пользовательский интерфейс может запускать и фиксировать транзакцию.
В моих предыдущих подходах к работе с транзакционными приложениями я группировал единицу работы вметод обслуживания в бэкэнде и аннотируйте его с помощью Spring @Transactional.
Но представьте, что у меня есть несколько таких методов обслуживания, и до внешнего интерфейса можно сгруппировать вызовы метода службы в транзакции.
Например,У меня есть methodServiceA, methodServiceB, methodServiceC.Пользовательский интерфейс может делать что-то подобное с любыми комбинациями, такими как:
Комбинация 1:
- запускает транзакцию
- вызывает methodServiceA + вызывать methodServiceB
- фиксирует транзакцию
комбинация 2:
- запускает транзакцию
- вызывает метод methodServiceB + вызывает methodServiceC
- фиксирует транзакцию
Комбинация 3:
- запускает транзакцию
- вызывает метод methodServiceA + вызывает метод methodServiceB + вызывает метод methodServiceC
- фиксирует транзакцию
По сути, бэкэнд предоставляет только метод services, и пользовательский интерфейс или другие приложения, использующие бэкэнд, могут запускать / фиксировать транзакцию.
Так что в основном это ситуацияЯ имею дело с ... и вот что я имею в виду.Пожалуйста, поделитесь некоторыми другими опциями или, возможно, улучшениями, которые я мог бы внести для поддержки этой функции.В настоящее время я думаю об использовании приложения управляемого объекта, поскольку я не думаю, что в этом случае сработает @Transactional.
Я думаю об объекте, который пользовательский интерфейс или другие соединители могут использовать для:
- создайте менеджер сущностей и свяжите его с уникальным идентификатором
- запустите транзакцию из em
- установите тайм-аут из em
- зафиксируйте транзакцию изem
- автоматически откатывает транзакцию, если есть какие-либо исключения из em
- , который передает менеджер сущности транзакции в методы сервиса, чтобы они использовали один и тот же менеджер сущности
- наконец закрывает менеджер сущностей после коммита или отката от em
Итак, для примера для Combination 1 поток выглядит примерно так:
- ui запускает транзакциюиспользуя инструмент, и получите идентификатор entitymanager
- , передающий идентификатор entitymanager при вызове methodServiceA +, вызывающий methodServiceB, so эти методы могут использовать правильный менеджер сущностей, связанный с идентификатором
- , который совершает транзакцию
Пожалуйста, поделитесь своими идеями по этому вопросу, спасибо!
По поводу фасада / шаблона команды:
Спасибо за идею.Но я тоже об этом думал, и я не думаю, что это подходит для наших нужд, поскольку я не всегда могу предоставить услуги фасада в бэкэнде для любых нужд (представьте кнопки каждого пользовательского интерфейса, которые могут комбинировать любые методы, которые они хотят), которые возникают.
Основная идея состоит в том, чтобы иметь общедоступные методы обслуживания, которые могли бы соединять другие приложения веб-интерфейса.
А также, использование шаблона фасада означает отсутствие пользовательской логики в методе фасада.В нашем случае логику пользовательского интерфейса можно выполнить вместе с обработкой транзакций и вызовом методов сервиса во внешнем интерфейсе.