В программном подходе транзакция управляется компонентами (или объектами), а в декларативном - контейнером.
Приложение Java EE использует интерфейс транзакций Java API (JTA) javax.transaction.UserTransaction для разграничения транзакции на ряд изменений в защищенных ресурсах программным путем. Транзакции, управляемые компонентами, можно использовать как в среде сервлета, так и в среде EJB. Если используется компонент EJB, для атрибута транзакции в файле описания необходимо задать TX_BEAN_MANAGED.
Обычно транзакция начинается с вызова UserTransaction.begin(). Когда компонент приложения готов зафиксировать изменения, он вызывает метод UserTransaction.commit() для согласования и фиксации изменений. Если компоненту приложения необходимо выполнить откат транзакции, он вызывает метод UserTransaction.rollback() для отмены всех изменений. Пример:
// Получить пользовательскую транзакцию
javax.transaction.UserTransaction transaction =
ejbcontext.getUserTransaction();
// Запустить транзакцию
transaction.begin();
// Внести изменения в защищенные ресурсы.
// Например, с помощью интерфейса взаимодействия Java EE или JCA
// отправить изменения в системы 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.