2013-08-01 4 views
0

Я прочитал в книге, что:Container граница удалось транзакции в SFSB

Как правило, контейнер сразу начинает транзакцию до начала метод корпоративного компонента. Он совершает транзакцию непосредственно перед выходом метода.

Предположим, что мой stateful EJB разоблачил 3 бизнес-метода, и клиент вызывает эти 3 метода последовательно и хочет, чтобы они запускали эти 3 метода в рамках одной транзакции. Эти методы будут вызываться через несколько запросов.

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

Обратите внимание, что я не хочу использовать собственную границу транзакции.

Любая помощь или указатель в правильном направлении были бы высоко оценены.

ответ

0

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

С точки зрения дизайна, это нормально, если транзакция запущена и совершенные/rollbacked от одного запроса (в рамках одной HttpServletRequest, например). В этом случае вы можете использовать UserTransaction для выполнения транзакции по нескольким вызовам в EJB. Но UserTransaction привязан к текущему потоку, поэтому может быть трудно передать его следующему запросу.

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

+0

Спасибо за детали. Хотя я не хотел использовать UserTransaction, кажется, что у меня нет другого выбора. – user2306993

0

Создайте метод в компоненте, который вызывает все остальные 3 метода. Тогда они будут в одной транзакции.

+0

Я могу это сделать, но дело в том, что этот метод будет вызываться через несколько запросов. – user2306993

+0

@ user2306993 Что касается «по нескольким запросам»: это изменяет вопрос/ответ, я добавил его к вашему вопросу. – Beryllium

+0

@Beryllium спасибо. Есть ли способ, с помощью которого я мог бы сигнализировать контейнеру, который запускает транзакцию так, как вы это делаете, но фиксировать данные, только если я говорю явно? – user2306993

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