throw new com.atomikos.icatch.RollbackException ( re.getMessage () );
}
if ( !(state_.equals ( TxState.LOCALLY_DONE ) || state_
.equals ( TxState.IN_DOUBT ) || state_.equals ( TxState.HEUR_HAZARD )) )
throw new SysException ( "Wrong state for commit: " + state_ );
try {
// refresh xaresource for MQSeries: seems to close XAResource after
// suspend???
testOrRefreshXAResourceFor2PC ();
if(LOGGER.isInfoEnabled()){
LOGGER.logInfo("XAResource.commit ( " + xidToHexString + " , " + onePhase
+ " ) on resource " + resourcename_
+ " represented by XAResource instance " + xaresource_);
}
xaresource_.commit ( xid_, onePhase );
} catch ( XAException xaerr ) {
String msg = interpretErrorCode ( resourcename_ , "commit" , xid_ , xaerr.errorCode );
LOGGER.logWarning ( msg , xaerr );
if ( (XAException.XA_RBBASE <= xaerr.errorCode)
&& (xaerr.errorCode <= XAException.XA_RBEND) ) {
errors.push ( xaerr );
if ( !onePhase )
throw new SysException ( msg , errors );
else
throw new com.atomikos.icatch.RollbackException (
"Already rolled back in resource." );
} else {
switch ( xaerr.errorCode ) {
case XAException.XA_HEURHAZ:
switchToHeuristicState ( "commit" , TxState.HEUR_HAZARD , xaerr );
throw new HeurHazardException ( getHeuristicMessages () );
case XAException.XA_HEURMIX:
switchToHeuristicState ( "commit", TxState.HEUR_MIXED , xaerr );
throw new HeurMixedException ( getHeuristicMessages () );
case XAException.XA_HEURCOM:
forget ();
break;
case XAException.XA_HEURRB:
switchToHeuristicState ( "commit", TxState.HEUR_ABORTED , xaerr );
throw new HeurRollbackException ( getHeuristicMessages () );
case XAException.XAER_NOTA:
if ( ! onePhase ) {
//see case 21552
LOGGER.logWarning("XAResource.commit: invalid Xid - transaction already committed in resource?");
setState ( TxState.TERMINATED );
break;
}
default:
//fix for bug 31209
switchToHeuristicState( "commit", TxState.HEUR_HAZARD , xaerr );
errors.push ( xaerr );
throw new SysException ( msg , errors );
} // switch
} // else
}
setState ( TxState.TERMINATED );
return getHeuristicMessages ();