close

API de transacciones de Java

Saltar a navegación Saltar a búsqueda

La API de transacción de Java ( JTA ) es una de las API que ofrece Java EE (Java Enterprise Edition) y está diseñada para permitir transacciones distribuidas , realizadas en múltiples recursos X/Open XA en un entorno Java . JTA es una especificación desarrollada bajo las directivas de Java Community Process como JSR 907 . La JTA proporciona:

  • una demarcación de los límites de la transacción.
  • de las API X/Open XA que permiten que los recursos participen en las transacciones.

X / Arquitectura Abierta XA

En esta arquitectura, un administrador de transacciones o un monitor de procesamiento de transacciones (monitor TP) coordina las transacciones a través de múltiples recursos, como bases de datos o colas de mensajes. Cada recurso tiene su propio Administrador de recursos. El administrador de recursos generalmente usa sus propias API para manipular recursos, como hacer que las API de JDBC funcionen con bases de datos relacionales. El administrador de recursos también permite que un monitor de TP coordine una transacción distribuida entre sí mismo y otros administradores de recursos. Finalmente, la aplicación que se comunica con el monitor TP se activa para realizar operaciones de transacción típicas, como iniciar (comenzar), confirmar y revertir . La aplicación también se comunica con recursos individuales para modificarlos, utilizando su propia API.

Implementación del JTA en la arquitectura X/Open XA

La API de JTA consta de una serie de clases divididas en los siguientes dos paquetes de Java :

El JTA se basa en el modelo de la arquitectura X/Open XA, pero define dos API diferentes para la demarcación de los límites de las transacciones. Se hace una distinción entre un servidor de aplicaciones como un servidor EJB y un componente de aplicación. Proporciona una interfaz javax.transaction.TransactionManager , que utiliza el servidor de aplicaciones real para iniciar, confirmar y revertir transacciones. También proporciona una interfaz diferente, javax.transaction.UserTransaction , que utiliza el código de cliente genérico, como un servlet o EJB, para gestionar transacciones.

La arquitectura JTA requiere que cada administrador de recursos implemente la interfaz javax.transaction.xa.XAResource para que el monitor TP lo administre. Como se explicó anteriormente, cada recurso tendrá su propia API específica, por ejemplo:

  • Las bases de datos relacionales usan JDBC
  • Los servicios de mensajería usan JMS
  • Los recursos del sistema de información empresarial generalizado (EIS) utilizan la arquitectura del conector Java EE.

API de transacciones de Java

La API de transacciones de Java consta de tres elementos: una interfaz de demarcación de transacciones de alto nivel en la aplicación, una interfaz de administrador de transacciones siempre de alto nivel y un mapeo estándar de Java del protocolo X/Open XA destinado a un administrador de recursos transaccional.

Interfaz UserTransaction

La interfaz javax.transaction.UserTransaction proporciona a la aplicación la capacidad de verificar los límites de transacción mediante programación. Esta interfaz puede ser utilizada por programas Java del lado del cliente o beans EJB.

El método begin () inicia una transacción global y la asocia con el subproceso de llamada. La asociación de transacción a subproceso es manejada de manera transparente por Transaction Manager.

No se requiere soporte para transacciones anidadas. El método begin () lanza la excepción NotSupportedException cuando el subproceso ya está asociado con una transacción y la implementación del Administrador de transacciones no admite transacciones anidadas.

El contexto en el que la transacción se propaga entre las aplicaciones lo asignan las implementaciones en segundo plano de los administradores de transacciones en las máquinas cliente y servidor. El formato de contexto utilizado para la propagación depende del protocolo y debe negociarse entre el cliente y el servidor. Por ejemplo, si el Transaction Manager es una implementación de la especificación JTS , utilizará la especificada en CORBA OTS 1.1. La propagación de transacciones es transparente para la aplicación.

@ Anotación transaccional

La anotación javax.transaction.Transactional proporciona a la aplicación la capacidad de comprobar los límites de transacciones de forma declarativa. Esta anotación se puede aplicar a cualquier clase que Java EE defina como bean gestionado (que incluye beans gestionados por CDI).

El siguiente ejemplo de código ilustra el uso de @Transactional en un ámbito donde se requieren beans administrados por CDI:

@RequestScoped 
clase pública  ExampleBean {  

    @Transactional 
    public  void  foo ()  {  // La transacción está activa aquí
        
        // Ejecutar algo de código

    }  // Después de la devolución, la transacción se confirma o revierte 
}

El comportamiento de la transacción se puede configurar con un atributo en la anotación.

Anotación @TransactionScoped

La anotación javax.transaction.TransactionScoped proporciona a la aplicación la capacidad de declarar que el alcance durante el cual vive un Bean está relacionado con el tiempo en que una determinada transacción está activa.

El siguiente ejemplo de código muestra el uso de @TransactionScoped en un ámbito donde se requieren beans administrados por CDI:

@TransactionScoped 
public  class  TxScopedBean  { 
    public  int  number ;

    public  int  getNumber ()  { número de retorno  ;} public void setNumber ( int number ) { this . numero = numero ;} }
          


@RequestScoped 
clase pública  ExampleBean {  

    @Inject 
    privado  TxScopedBean  txScopedBean ;

    @Transactional 
    public  void  foo ()  { 
        txScopedBean . establecerNúmero ( 1 ); 
    }

    @Transactional 
    public  void  bar ()  { 
        System . fuera _ imprimir ( tXscopedBean . getNumber ()); 
    } 
}

Si se llama primero al método foo () en una instancia administrada de ExampleBean y luego se llama al método bar () , el número impreso en la pantalla será 0 y no 1. Esto se debe a que cada método tiene su propia transacción y, por lo tanto, también la propia instancia de TxScopedBean. Por lo tanto, el número 1 que se asigna durante la llamada a foo () no será visible durante la llamada a bar () .

Soporte de UserTransaction en servidores EJB

Los servidores EJB deben admitir la interfaz UserTransaction para que la utilicen los beans EJB con el valor BEAN en la anotación javax.ejb.TransactionManagement (esto se denomina transacción gestionada por beans o BMT). La interfaz UserTransaction se expone a los componentes EJB a través de la interfaz EJBContext usando el método getUserTransaction y directamente usando la anotación @Resource genérica . Por lo tanto, una aplicación EJB no interactúa directamente con Transaction Manager para la demarcación de transacciones; en cambio, los beans EJB se basan en el servidor EJB para proporcionar soporte para todo su trabajo transaccional, como se define en la Especificación de Enterprise JavaBeans. (La interacción subyacente entre el servidor EJB y TM es transparente para la aplicación; la carga de implementar la gestión de transacciones recae en el contenedor EJB y el proveedor del servidor).

El siguiente código de ejemplo demuestra el uso de UserTransaction a través de transacciones administradas por beans en una sesión de EJB Bean:

@Stateless 
@TransactionManagement ( BEAN ) 
clase pública  ExampleBean {  

    @Resource 
    privado  UserTransaction  utx ;

    public  void  foo ()  { 
        // iniciar una transacción 
        utx . comenzar ();

        // Hacer trabajo

        // Confirmarlo 
        utx . cometer (); 
    } 
}

Alternativamente, UserTransaction se puede obtener de SessionContext :

@Stateless 
@TransactionManagement ( BEAN ) 
clase pública  ExampleBean {  

    @Resource 
    privado  SessionContext  ctx ;

    public  void  foo ()  { 
        UserTransaction  utx  =  ctx . obtenerTransacciónUsuario ();

        // iniciar una transacción 
        utx . comenzar ();

        // Hacer trabajo

        // Confirmarlo 
        utx . cometer (); 
    } 
}

Tenga en cuenta que, en el ejemplo, si se hubiera omitido la anotación @TransactionManagement (BEAN) , una transacción JTA se habría iniciado automáticamente cada vez que se llama a foo () y, de nuevo automáticamente, se produciría una confirmación y una reversión al salir de foo ( ) . Por lo tanto, el uso de una UserTransaction no es necesario en la programación EJB, pero puede ser necesario en un código más especializado.

Soporte UserTransaction en JNDI

UserTransaction está disponible en java: comp / UserTransaction , si una implementación de JTA está instalada en su entorno.

Implementaciones de código abierto para JTA

Algunas implementaciones de código abierto para JTA se enumeran a continuación (a partir de septiembre de 2010):

  • narayana
  • Transacciones de AtomikosEssentials
  • Bitronix JTA

Artículos relacionados

Enlaces externos