Программный подход предполагает, что транзакция управляется компонентами, а декларативный подход предполагает, что транзакция управляется контейнером.
Для разграничения транзакции на ряд изменений в защищенных ресурсах программным путем в приложении 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.