This is an example of a transaction that is suspended and then is resumed.
import java.sql.*;
import javax.sql.*;
import java.util.*;
import javax.transaction.*;
import javax.transaction.xa.*;
import com.ibm.db2.jdbc.app.*;
public class JTATxSuspend {
public static void main(java.lang.String[] args) {
JTATxSuspend test = new JTATxSuspend();
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... doesn't exist
}
s.executeUpdate("CREATE TABLE CUJOSQL.JTATABLE (COL1 CHAR (50))");
s.executeUpdate("INSERT INTO CUJOSQL.JTATABLE VALUES('Fun with JTA')");
s.executeUpdate("INSERT INTO CUJOSQL.JTATABLE VALUES('JTA is fun.)");
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. 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);
// Create a ResultSet during JDBC processing and fetch a row.
ResultSet rs = stmt.executeUpdate("SELECT * FROM CUJOSQL.JTATABLE");
rs.next();
// The end method is called with the suspend option. The
// ResultSets associated with the current transaction are 'on hold'.
// They are neither gone nor accessible in this state.
xaRes.end(xid, XAResource.TMSUSPEND);
// Other work can be performed with the transaction.
// As an example, you can create a statement and process a query.
// This work and any other transactional work that the transaction may
// perform is separate from the work done previously under the XID.
Statement nonXAStmt = conn.createStatement();
ResultSet nonXARS = nonXAStmt.executeQuery("SELECT * FROM CUJOSQL.JTATABLE");
while (nonXARS.next()) {
// Process here...
}
nonXARS.close();
nonXAStmt.close();
// If an attempt is made to use any suspended transactions
// resources, an exception results.
try {
rs.getString(1);
System.out.println("Value of the first row is " + rs.getString(1));
} catch (SQLException e) {
System.out.println("This was an expected exception - " +
"suspended ResultSet was used.");
}
// Resume the suspended transaction and complete the work on it.
// The ResultSet is exactly as it was before the suspension.
xaRes.start(newXid, XAResource.TMRESUME);
rs.next();
System.out.println("Value of the second row is " + rs.getString(1));
// When the transaction has completed, end it
// and commit any work under it.
xaRes.end(xid, XAResource.TMNOFLAGS);
int rc = xaRes.prepare(xid);
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();
}
}
}
}