public void commit(Xid xid, boolean isOnePhase) throws XAException { // always call prepare() - even if this is just a 1PC! if (isOnePhase) prepare(xid); if (trace) log.trace("committing TransactionXaAdapter: " + globalTx); try { LocalTxInvocationContext ctx = icc.createTxInvocationContext(); ctx.setXaCache(this); if (configuration.isOnePhaseCommit()) { checkMarkedForRollback(); if (trace) log.trace("Doing an 1PC prepare call on the interceptor chain"); PrepareCommand command = commandsFactory.buildPrepareCommand(globalTx, modifications, true); try { invoker.invoke(ctx, command); } catch (Throwable e) { log.error("Error while processing 1PC PrepareCommand", e); throw new XAException(XAException.XAER_RMERR); } } else { CommitCommand commitCommand = commandsFactory.buildCommitCommand(globalTx); try { invoker.invoke(ctx, commitCommand); } catch (Throwable e) { log.error("Error while processing 1PC PrepareCommand", e); throw new XAException(XAException.XAER_RMERR); } } } finally { txTable.removeLocalTransaction(transaction); this.modifications = null; } }
public void testPrepareTxMarkedForRollback() { localTx.markForRollback(); try { xaAdapter.prepare(xid); assert false; } catch (XAException e) { assert e.errorCode == XAException.XA_RBROLLBACK; } }
public void testPrepareOnNonexistentXid() { DummyXid xid = new DummyXid(); try { xaAdapter.prepare(xid); assert false; } catch (XAException e) { assert e.errorCode == XAException.XAER_NOTA; } }
public void testOnePhaseCommitConfigured() throws XAException { configuration.setCacheMode(Configuration.CacheMode.INVALIDATION_ASYNC); // this would force 1pc assert XAResource.XA_OK == xaAdapter.prepare(xid); }