Читаем Изучаем Java EE 7 полностью

Наследует от@ApplicationExceptionТранзакция помечена для отката
ExceptionНет аннотацииНет
Exceptionrollback = trueДа
Exceptionrollback = falseНет
RuntimeExceptionНет аннотацииДа
RuntimeExceptionrollback = trueДа
RuntimeExceptionrollback = falseНет

Транзакции, управляемые компонентом. С помощью CMT вы указываете контейнеру сделать разграничение транзакций, просто указав атрибут транзакции и используя контекст сеанса или исключения для пометки транзакции для отката. В некоторых случаях декларативный CMT не может обеспечить необходимую детализацию разграничения (например, метод не может генерировать более одной транзакции). Для того чтобы решить эту проблему, EJB предлагает программный способ управления разграничением транзакций с помощью BMT. BMT позволяет явно управлять границами транзакций (начало, фиксация, откат) с использованием JTA.

Для того чтобы отключить разграничение по умолчанию CMT и переключиться в режим BMT, компонент просто должен использовать аннотацию @javax.ejb.TransactionManagement (или XML-эквивалент в файле ejb-jar.xml) следующим образом:

@Stateless

@TransactionManagement(TransactionManagementType.BEAN)

public class ItemEJB {…}

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

Основной интерфейс, используемый для проведения ВМТ, — javax.transaction.UserTransaction. Он позволяет компоненту разграничивать транзакции, получает их состояние, задает тайм-аут и т. д. В контейнере EJB создается экземпляр типа UserTransaction, который становится доступным благодаря внедрению зависимостей, поиску JNDI или контексту SessionContext (с помощью метода SessionContext.getUserTransaction()). Этот API описывается в табл. 9.5.

Таблица 9.5. Методы интерфейса javax.transaction.UserTransaction
МетодОписание
beginНачинает новую транзакцию и связывает ее с текущим потоком
commitФиксирует транзакцию, связанную с текущим потоком
rollbackОткатывает транзакцию, связанную с текущим потоком
setRollbackOnlyПомечает транзакцию для отката
getStatusПолучает текущее состояние транзакции
setTransactionTimeoutИзменяет тайм-аут текущих транзакций

В листинге 9.6 показано, как разработать компонент BMT. Прежде всего мы получаем ссылку на объект типа UserTransaction с использованием внедрения через аннотацию @Resource. Метод OneItemSold() начинает транзакцию, выполняет обработку, а затем, в зависимости от бизнес-логики, совершает фиксацию или откат транзакции. Отмечу также, что транзакция помечается для отката в блоке catch (для удобства чтения я упростил обработку исключений).

Листинг 9.6. Компонент, не сохраняющий состояния и использующий ВМТ

@Stateless

@TransactionManagement(TransactionManagementType.BEAN)

public class InventoryEJB {

··@PersistenceContext(unitName = "chapter09PU")

··private EntityManager em;

··@Resource

··private UserTransaction ut;

··public void oneItemSold(Item item) {

····try {

······ut.begin();

······item.decreaseAvailableStock();

······sendShippingMessage();

······if (inventoryLevel(item) == 0)

········ut.rollback();

······else

········ut.commit();

······} catch (Exception e) {

······ut.rollback();

····}

····sendInventoryAlert();

··}

}

Разница с CMT, показанным в листинге 9.3, заключается в том, что с CMT контейнер запускает транзакцию до исполнения метода и фиксирует ее сразу после его отработки. С BMT, показанным в листинге 9.6, вы вручную определяете границы транзакции внутри самого метода.

<p>Поддержка транзакций в Managed Beans</p>
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных