Once again I seem to have found a solution shortly after asking the question...
On 08/04/2008, Alistair Young <[EMAIL PROTECTED]> wrote: > [ ... snip ... ] > > // start a transaction > // [iBATIS starts a new JTA transaction...?] > sqlMapClient.startTransaction(); > > // ... do some database processing ... > > // start an inner transaction > // [iBATIS joins the existing JTA transaction...?] > sqlMapClient.startTransaction(); > > // ... do some more database processing ... > > // abandon the inner transaction > // [iBATIS issues setRollbackOnly on JTA transaction...?] > sqlMapClient.endTransaction(); > > // commit the outer transaction > // [iBATIS issues commit on JTA transaction...?] > sqlMapClient.commitTransaction(); > > with the final result that the database is unchanged. However, > instead, I get an exception on my second call to startTransaction() > complaining that a transaction is already started. > > [ ... snip ... ] After a bit of experimentation, I think that I need to explicitly start the JTA transaction outside of the iBATIS transactions. The following does what I'd expected: // start a JTA transaction Context ctx = new InitialContext(); UserTransaction ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); ut.begin(); // start an iBATIS transaction // [iBATIS joins the JTA transaction] sqlMapClient.startTransaction(); // ... do some database processing ... // commit the iBATIS transaction // [iBATIS does not actually commit to the db] sqlMapClient.commitTransaction(); // start another iBATIS transaction // [iBATIS joins the JTA transaction] sqlMapClient.startTransaction(); // ... do some more database processing ... // abandon the iBATIS transaction // [iBATIS issues setRollbackOnly on JTA transaction] sqlMapClient.endTransaction(); // commit the JTA transaction try { ut.commit(); } catch (RollbackException x) { // will be raised because the commit did // not take place (since the second iBATIS // transaction was cancelled) } Please feel free to suggest a better way, if one should exist! Alistair.