A abordagem programática é uma transação gerenciada por componente (ou gerenciada por bean) e a abordagem de demarcação de transação declarativa é a transação gerenciada por contêiner.
O aplicativo Java EE usa a interface javax.transaction.UserTransaction do Java Transaction API (JTA) para demarcar um limite da transação para um conjunto de mudanças no recurso protegido de forma programática. As transações gerenciadas por componentes podem ser usadas no ambiente de servlet e do EJB. No caso de um componente EJB, você configura o atributo de transação em seu descritor de implementação como TX_BEAN_MANAGED.
Uma transação normalmente começa com uma chamada UserTransaction.begin(). Quando o componente de aplicativo está pronto para confirmar as mudanças, ele invoca uma chamada UserTransaction.commit() para coordenar e confirmar as mudanças. Se o componente de aplicativo precisar recuperar a transação, ele chamará UserTransaction.rollback(), e todas as mudanças serão desfeitas. Por exemplo:
// Obter a Transação do Usuário
javax.transaction.UserTransaction transaction =
ejbcontext.getUserTransaction();
// Iniciar a transação
transaction.begin();
// Fazer alterações nos recursos protegidos.
// Por exemplo, usar a interface de interação CCI do Java EE ou JCA
// para enviar alterações para um sistema EIS
interaction.execute(interactionSpec, input, output);
if (/* decide to commit */) {
// confirmar a transação
transaction.commit();
} else { /* decide to roll back */
// desfazer a transação
transaction.rollback();
}
As transações gerenciadas por contêiner podem ser usadas apenas no ambiente do EJB. O componente EJB especifica uma transação gerenciada por contêiner de forma declarada através do atributo de transação no descritor de implementação (como TX_REQUIRED). Uma transação gerenciada por contêiner é gerenciada pelo contêiner EJB. O contêiner chama os métodos adequados (como begin, commit ou rollback) em nome do componente EJB. Essa abordagem declarativa simplifica as chamadas de programação no componente EJB.