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(); } } } }