Программный подход предполагает, что транзакция управляется компонентами, а декларативный подход предполагает, что транзакция управляется контейнером.
Для разграничения транзакции на ряд изменений в защищенных ресурсах программным путем в приложении J2EE используется интерфейс JTA javax.transaction.UserTransaction. Транзакции, управляемые компонентами, можно использовать как в среде сервлета, так и в среде EJB. В случае среды EJB для значения атрибута транзакции в файле описания необходимо задать TX_BEAN_MANAGED.
Обычно транзакция начинается с вызова UserTransaction.begin(). Когда компонент приложения готов зафиксировать изменения, он вызывает метод UserTransaction.commit() для согласования и фиксации изменений. Если компоненту приложения необходимо выполнить откат транзакции, он вызывает метод UserTransaction.rollback() для отмены всех изменений. Например:
// Получить пользовательскую транзакцию javax.transaction.UserTransaction transaction = ejbcontext.getUserTransaction(); // Запустить транзакцию transaction.begin(); // Внести изменения в защищенные ресурсы. // Например, с помощью интерфейса взаимодействия CCI J2EE/CA // отправить изменения в системы EIS interaction.execute(interactionSpec, input, output); if (/* decide to commit */) { // зафиксировать транзакцию transaction.commit(); } else { /* если необходим откат */ // откатить транзакцию transaction.rollback(); }
Транзакции, управляемые контейнером, можно использовать только в среде EJB. В среде EJB используется декларативный подход для описания транзакции, управляемой контейнером. Для этой цели настраивается атрибут транзакции в файле описания (например, TX_REQUIRED). Обработкой такой транзакции управляет контейнер EJB. Контейнер вызывает соответствующие методы (например, begin, commit или rollback) от имени компонента среды EJB. Подобный декларативный подход упрощает программные вызовы в среде EJB.
Связанная информация: Дополнительную информацию об архитектуре J2EE и спецификациях JTA можно найти на Web-сайте http://java.sun.com/j2ee/docs.html.