The Java Transaction API (JTA) is one of the Java EE APIs allowing distributed transactions to be done across multiple XA resources. Java Platform Enterprise Edition or Java EE is a widely used platform for server programming in the Java programming language In computing the XA standard is a specification by The Open Group for Distributed transaction processing (DTP JTA is a specification developed under the Java Community Process as JSR 907. The Java Community Process or JCP, established in 1998, is a formalized process which allows interested parties to be involved in the definition of future versions JTA provides for:
Contents |
In the X/Open XA architecture, a transaction manager or transaction processing monitor (TP monitor), coordinates the transactions across multiple resources such as a database. For other meanings see the disambiguation page at Transaction. Each resource has its own manager. The resource manager typically has its own API for manipulating the resource, for example the JDBC API used by relational databases. Java Database Connectivity (JDBC is an API for the Java programming language that defines how a client may access a Database. In addition, the resource manager allows a TP monitor to coordinate a distributed transaction between its own and other resource managers. Finally, there is the application which communicates with the TP monitor to begin, commit or rollback the transactions. The application also communicates with the individual resources using their own API to modify the resource.
The JTA API consists of classes in two Java packages:
The JTA is modelled on the X/Open XA architecture, but it defines two different APIs for demarcating transaction boundaries. A Java package is a mechanism for organizing Java classes into namespaces similar to the modules of Modula. It distinguishes between an application server such as an EJB server and an application component. It provides an interface, javax.transaction.TransactionManager, that is used by the application server itself to begin, commit and rollback the transactions. It provides a different interface, the javax.transaction.UserTransaction, that is used by general client code such as a servlet or an EJB to manage the transactions.
The JTA architecture requires that each resource manager must implement the javax.transaction.xa.XAResource interface in order to be managed by the TP monitor. As stated previously, each resource will have its own specific API, for instance:
The Java Transaction API consists of three elements: a high-level application transaction demarcation interface, a high-level transaction manager interface intended for an application server, and a standard Java mapping of the X/Open XA protocol intended for a transactional resource manager.
UserTransaction Interface
The javax. transaction. UserTransaction interface provides the application the ability to control transaction boundaries programmatically. This interface may be used by Java client programs or EJB beans.
The UserTransaction. begin method starts a global transaction and associates the transaction with the calling thread. The transaction-to-thread association is managed transparently by the Transaction Manager.
Support for nested transactions is not required. The UserTransaction. begin method throws the NotSupportedException when the calling thread is already associated with a transaction and the transaction manager implementation does not support nested transactions.
Transaction context propagation between application programs is provided by the underlying transaction manager implementations on the client and server machines. The transaction context format used for propagation is protocol dependent and must be negotiated between the client and server hosts. For example, if the transaction manager is an implementation of the JTS specification, it will use the transaction context propagation format as specified in the CORBA OTS 1. 1 specification. Transaction propagation is transparent to application programs.
UserTransaction Support in EJB Server
EJB servers are required to support the UserTransaction interface for use by EJB beans with the TX_BEAN_MANAGED transaction attribute. The UserTransaction interface is exposed to EJB components through the EJBContext interface using the getUserTransaction method. Thus, an EJB application does not interface with the Transaction Manager directly for transaction demarcation; instead, the EJB bean relies on the EJB Server to provide support for all of its transaction work as defined in the Enterprise JavaBeans Specification [5]. (The underlying interaction between the EJB Server and the TM is transparent to the application. ) The code sample below illustrates the usage of UserTransaction by a TX_BEAN_MANAGED EJB session bean:
// In the session bean’s setSessionContext method,
// store the bean context in an instance variable
this. ctx = sessionContext;
// somewhere else in the bean’s business logic
UserTransaction utx = ctx. getUserTransaction();
// start a transaction
utx. begin();
// Do work
// Commit it
utx. commit();
The UserTransaction should be available under java:comp/UserTransaction (if a JTA implementation is installed in the environment).
You don't necessarily need an application server to have JTA or UserTransaction functionality. Independent JTA implementations exist (see the links section below) so that you can even also have JTA/XA reliability in regular Java applications. Especially when combined with tools like Spring, this can give an interesting and powerful paradigm for developing reliable Java applications.