2016-10-26 3 views
0

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

Является ли это хорошей практикой или они должны просто повторно выбрасывать исключение &, наконец, компонент инициатора выполняет только откат.

Кроме того, если на EJB имеется одиночная транзакция, тогда откат должен происходить в компоненте-отправителе или в случае возникновения исключения.

Тип транзакции JTA для сохранения с источником данных XA.

ответ

1

С этим

помечена для отката

вы имеете в виду, что EJB поймать исключение и использовать setRollbackOnly?

Если это так, то это зависит от вашего дизайна, чтобы решить, какой подход является предпочтительным.

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

Но, если ваша бизнес-логика требует, чтобы даже бизнес-исключение оказало существенное влияние, так что оно должно иметь эффект отката всей транзакции, тогда у вас есть выбор setRollBackOnly или запуск исключения приложения с rollback=true.

Этот второй подход также влияет на уничтожение боба.

Что касается вашего второго вопроса:

Кроме того, если есть одна транзакции, натянутая через EJB, а затем отката должен произойти в отправителе бобе или где он встречается исключения.

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

+0

+1 Да, это очень специфичный дизайн. Но из-за некоторых сложных сценариев, не теряйте вещи где-то посередине. Кроме того, некоторые другие компоненты могут быть добавлены в будущий поток, а затем они должны отслеживать, что происходит с транзакцией до и после; поэтому думая, что каждый боб должен независимо управлять без внешней зависимости. Это скорее вопрос дизайна и практика. –

+0

Еще один довольно распространенный подход, который я часто видел, заключается в том, чтобы перехватывать исключение на уровне bean и повторно вызывать исключение EJBException или настраиваемое исключение, расширяющее EJBException. Таким образом, вы все равно можете регистрировать то, что пошло не так, и получить выгоду от контейнера, возвращающего транзакцию. – Leonardo

Смежные вопросы