Example: Using JTA to handle a transaction
This is an example of how to use the Java™ Transaction API (JTA) to handle a transaction in an application.
Note: By using the code examples, you agree to the terms of the Code license and disclaimer information.
import java.sql.*;
import javax.sql.*;
import java.util.*;
import javax.transaction.*;
import javax.transaction.xa.*;
import com.ibm.db2.jdbc.app.*;
public class JTACommit {
public static void main(java.lang.String[] args) {
JTACommit test = new JTACommit();
test.setup();
test.run();
}
/**
* Handle the previous cleanup run so that this test can recommence.
*/
public void setup() {
Connection c = null;
Statement s = null;
try {
Class.forName("com.ibm.db2.jdbc.app.DB2Driver");
c = DriverManager.getConnection("jdbc:db2:*local");
s = c.createStatement();
try {
s.executeUpdate("DROP TABLE CUJOSQL.JTATABLE");
} catch (SQLException e) {
// Ignore... does not exist
}
s.executeUpdate("CREATE TABLE CUJOSQL.JTATABLE (COL1 CHAR (50))");
s.close();
} finally {
if (c != null) {
c.close();
}
}
}
/**
* This test uses JTA support to handle transactions.
*/
public void run() {
Connection c = null;
try {
Context ctx = new InitialContext();
// Assume the data source is backed by a UDBXADataSource.
UDBXADataSource ds = (UDBXADataSource) ctx.lookup("XADataSource");
// From the DataSource, obtain an XAConnection object that
// contains an XAResource and a Connection object.
XAConnection xaConn = ds.getXAConnection();
XAResource xaRes = xaConn.getXAResource();
Connection c = xaConn.getConnection();
// For XA transactions, a transaction identifier is required.
// An implementation of the XID interface is not included with the
// JDBC driver. See Transactions with JTA for a description of
// this interface to build a class for it.
Xid xid = new XidImpl();
// The connection from the XAResource can be used as any other
// JDBC connection.
Statement stmt = c.createStatement();
// The XA resource must be notified before starting any
// transactional work.
xaRes.start(xid, XAResource.TMNOFLAGS);
// Standard JDBC work is performed.
int count =
stmt.executeUpdate("INSERT INTO CUJOSQL.JTATABLE VALUES('JTA is pretty fun.')");
// When the transaction work has completed, the XA resource must
// again be notified.
xaRes.end(xid, XAResource.TMSUCCESS);
// The transaction represented by the transaction ID is prepared
// to be committed.
int rc = xaRes.prepare(xid);
// The transaction is committed through the XAResource.
// The JDBC Connection object is not used to commit
// the transaction when using JTA.
xaRes.commit(xid, false);
} catch (Exception e) {
System.out.println("Something has gone wrong.");
e.printStackTrace();
} finally {
try {
if (c != null)
c.close();
} catch (SQLException e) {
System.out.println("Note: Cleaup exception.");
e.printStackTrace();
}
}
}
}