Example: Using a connection with multiple transactions
This is an example of how to use a single connection with multiple transactions.
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 JTAMultiTx {
public static void main(java.lang.String[] args) {
JTAMultiTx test = new JTAMultiTx();
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();
Statement stmt = c.createStatement();
// For XA transactions, a transaction identifier is required.
// This is not meant to imply that all the XIDs are the same.
// Each XID must be unique to distinguish the various transactions
// that occur.
// Support for creating XIDs is again left to the application
// program.
Xid xid1 = JDXATest.xidFactory();
Xid xid2 = JDXATest.xidFactory();
Xid xid3 = JDXATest.xidFactory();
// Do work under three transactions for this connection.
xaRes.start(xid1, XAResource.TMNOFLAGS);
int count1 = stmt.executeUpdate("INSERT INTO CUJOSQL.JTATABLE VALUES('Value 1-A')");
xaRes.end(xid1, XAResource.TMNOFLAGS);
xaRes.start(xid2, XAResource.TMNOFLAGS);
int count2 = stmt.executeUpdate("INSERT INTO CUJOSQL.JTATABLE VALUES('Value 1-B')");
xaRes.end(xid2, XAResource.TMNOFLAGS);
xaRes.start(xid3, XAResource.TMNOFLAGS);
int count3 = stmt.executeUpdate("INSERT INTO CUJOSQL.JTATABLE VALUES('Value 1-C')");
xaRes.end(xid3, XAResource.TMNOFLAGS);
// Prepare all the transactions
int rc1 = xaRes.prepare(xid1);
int rc2 = xaRes.prepare(xid2);
int rc3 = xaRes.prepare(xid3);
// Two of the transactions commit and one rolls back.
// The attempt to insert the second value into the table is
// not committed.
xaRes.commit(xid1, false);
xaRes.rollback(xid2);
xaRes.commit(xid3, 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();
}
}
}
}