public BitronixTransaction() { Uid gtrid = UidGenerator.generateUid(); if (log.isDebugEnabled()) { log.debug("creating new transaction with GTRID [" + gtrid + "]"); } this.resourceManager = new XAResourceManager(gtrid); this.threadName = Thread.currentThread().getName(); }
private void fireAfterCompletionEvent() { // this TX is no longer in-flight -> remove this transaction's state from all XAResourceHolders getResourceManager().clearXAResourceHolderStates(); if (log.isDebugEnabled()) log.debug("after completion, " + synchronizationScheduler.size() + " synchronization(s) to execute"); for (Synchronization synchronization : synchronizationScheduler) { try { if (log.isDebugEnabled()) log.debug("executing synchronization " + synchronization + " with status=" + Decoder.decodeStatus(status)); synchronization.afterCompletion(status); } catch (Exception ex) { log.warn("Synchronization.afterCompletion() call failed for " + synchronization, ex); } } ManagementRegistrar.unregister("bitronix.tm:type=Transaction,Gtrid=" + resourceManager.getGtrid()); }
SortedSet<Integer> positions; if (reverse) { positions = resourceManager.getReverseOrderPositions(); if (log.isDebugEnabled()) log.debug("executing phase on " + resourceManager.size() + " resource(s) enlisted in " + positions.size() + " position(s) in reverse position order"); positions = resourceManager.getNaturalOrderPositions(); if (log.isDebugEnabled()) log.debug("executing phase on " + resourceManager.size() + " resource(s) enlisted in " + positions.size() + " position(s) in natural position order"); List<XAResourceHolderState> resources; if (reverse) { resources = resourceManager.getReverseOrderResourcesForPosition(positionKey); } else { resources = resourceManager.getNaturalOrderResourcesForPosition(positionKey);
if (log.isDebugEnabled()) log.debug("rolling back, " + resourceManager.size() + " enlisted resource(s)"); List<XAResourceHolderState> allResources = resourceManager.getAllResources(); for (XAResourceHolderState resource : allResources) { if (!resource.isFailed())
if (log.isDebugEnabled()) log.debug("committing, " + resourceManager.size() + " enlisted resource(s)"); if (resourceManager.size() == 0 && TransactionManagerServices.getConfiguration().isDebugZeroResourceTransaction()) { log.warn(buildZeroTransactionDebugMessage(activationStackTrace, new StackTrace()));
XAResourceHolderState alreadyEnlistedHolder = findXAResourceHolderState(xaResourceHolderState.getXAResource()); if (alreadyEnlistedHolder != null && !alreadyEnlistedHolder.isEnded()) { xaResourceHolderState.setXid(alreadyEnlistedHolder.getXid()); if (alreadyEnlistedHolder != null) { if (log.isDebugEnabled()) { log.debug("resource already enlisted but has been ended eligible for join: " + alreadyEnlistedHolder); } toBeJoinedHolderState = getManagedResourceWithSameRM(xaResourceHolderState);
List<XAResourceHolderState> allResources = resourceManager.getAllResources(); List<XAResourceHolderState> rolledBackResources = new ArrayList<XAResourceHolderState>(); List<XAResourceHolderState> failedResources = new ArrayList<XAResourceHolderState>();
@Override public Collection<String> getEnlistedResourcesUniqueNames() { return resourceManager.collectUniqueNames(); }
/** * Resume all enlisted resources in the current transaction context. * @throws XAException if the resource threw an exception during resume. */ public void resume() throws XAException { // all XAResource needs to be re-enlisted but this must happen // outside the Scheduler's iteration as enlist() can change the // collection's content and confuse the iterator. List<XAResourceHolderState> toBeReEnlisted = new ArrayList<XAResourceHolderState>(); for (XAResourceHolderState xaResourceHolderState : resources) { if (log.isDebugEnabled()) { log.debug("resuming " + xaResourceHolderState); } // If a prepared statement is (re-)used after suspend/resume is performed its XAResource needs to be // re-enlisted. This must be done outside this loop or that will confuse the iterator! toBeReEnlisted.add(new XAResourceHolderState(xaResourceHolderState)); } if (toBeReEnlisted.size() > 0 && log.isDebugEnabled()) log.debug("re-enlisting " + toBeReEnlisted.size() + " resource(s)"); for (XAResourceHolderState xaResourceHolderState : toBeReEnlisted) { if (log.isDebugEnabled()) { log.debug("re-enlisting resource " + xaResourceHolderState); } try { enlist(xaResourceHolderState); xaResourceHolderState.getXAResourceHolder().putXAResourceHolderState(xaResourceHolderState.getXid(), xaResourceHolderState); } catch (BitronixSystemException ex) { throw new BitronixXAException("error re-enlisting resource during resume: " + xaResourceHolderState, XAException.XAER_RMERR, ex); } } }
/** * Delist the specified {@link XAResourceHolderState}. A reference to the resource is kept anyway. * @param xaResourceHolderState the {@link XAResourceHolderState} to be delisted. * @param flag the delistment flag. * @return true if the resource could be delisted, false otherwise. * @throws XAException if the resource threw an exception during delistment. * @throws BitronixSystemException if an internal error occured. */ public boolean delist(XAResourceHolderState xaResourceHolderState, int flag) throws XAException, BitronixSystemException { if (findXAResourceHolderState(xaResourceHolderState.getXAResource()) != null) { if (log.isDebugEnabled()) { log.debug("delisting resource " + xaResourceHolderState); } xaResourceHolderState.end(flag); return true; } log.warn("trying to delist resource that has not been previously enlisted: " + xaResourceHolderState); return false; }
private boolean delistResource(XAResourceHolderState resourceHolderState, int flag) throws BitronixSystemException { try { return resourceManager.delist(resourceHolderState, flag); } catch (XAException ex) { // if the resource could not be delisted, the transaction must not commit -> mark it as rollback only if (status != Status.STATUS_MARKED_ROLLBACK) setStatus(Status.STATUS_MARKED_ROLLBACK); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(ex); if (BitronixXAException.isUnilateralRollback(ex)) { // The resource unilaterally rolled back here. We have to throw an exception to indicate this but // The signature of this method is inherited from javax.transaction.Transaction. Thereof, we have choice // between creating a sub-exception of SystemException or using a RuntimeException. Is that the best way // forward as this 'hidden' exception can be left throw out at unexpected locations where SystemException // should be rethrown but the exception thrown here should be catched & handled... ? throw new BitronixRollbackSystemException("resource " + resourceHolderState + " unilaterally rolled back, error=" + Decoder.decodeXAExceptionErrorCode(ex) + (extraErrorDetails == null ? "" : ", extra error=" + extraErrorDetails), ex); } throw new BitronixSystemException("cannot delist " + resourceHolderState + ", error=" + Decoder.decodeXAExceptionErrorCode(ex) + (extraErrorDetails == null ? "" : ", extra error=" + extraErrorDetails), ex); } }
SortedSet<Integer> positions; if (reverse) { positions = resourceManager.getReverseOrderPositions(); if (log.isDebugEnabled()) { log.debug("executing phase on " + resourceManager.size() + " resource(s) enlisted in " + positions.size() + " position(s) in reverse position order"); } positions = resourceManager.getNaturalOrderPositions(); if (log.isDebugEnabled()) { log.debug("executing phase on " + resourceManager.size() + " resource(s) enlisted in " + positions.size() + " position(s) in natural position order"); } List<XAResourceHolderState> resources; if (reverse) { resources = resourceManager.getReverseOrderResourcesForPosition(positionKey); } else { resources = resourceManager.getNaturalOrderResourcesForPosition(positionKey);
if (log.isDebugEnabled()) log.debug("rolling back, " + resourceManager.size() + " enlisted resource(s)"); List<XAResourceHolderState> allResources = resourceManager.getAllResources(); for (XAResourceHolderState resource : allResources) { if (!resource.isFailed())
if (log.isDebugEnabled()) { log.debug("committing, " + resourceManager.size() + " enlisted resource(s)"); } if (resourceManager.size() == 0 && TransactionManagerServices.getConfiguration().isDebugZeroResourceTransaction()) { log.warn(buildZeroTransactionDebugMessage(activationStackTrace, new StackTrace()));
XAResourceHolderState alreadyEnlistedHolder = findXAResourceHolderState(xaResourceHolderState.getXAResource()); if (alreadyEnlistedHolder != null && !alreadyEnlistedHolder.isEnded()) { xaResourceHolderState.setXid(alreadyEnlistedHolder.getXid()); if (alreadyEnlistedHolder != null) { if (log.isDebugEnabled()) { log.debug("resource already enlisted but has been ended eligible for join: " + alreadyEnlistedHolder); } toBeJoinedHolderState = getManagedResourceWithSameRM(xaResourceHolderState);
List<XAResourceHolderState> allResources = resourceManager.getAllResources(); List<XAResourceHolderState> rolledBackResources = new ArrayList<XAResourceHolderState>(); List<XAResourceHolderState> failedResources = new ArrayList<XAResourceHolderState>();
@Override public Collection<String> getEnlistedResourcesUniqueNames() { return resourceManager.collectUniqueNames(); }