Source:
<code>public void rollback () throws SystemException { if (jtsLogger.logger.isTraceEnabled()) { jtsLogger.logger.trace("ArjunaTransactionImple::rollback for " + get_uid()); } if (ArjunaTransactionImple._checkedTransactions && !checkAccess()) { throw new NO_PERMISSION(0, CompletionStatus.COMPLETED_NO); } int status = super.status(); if ((status == ActionStatus.RUNNING) || (status == ActionStatus.ABORT_ONLY)) { if (ArjunaTransactionImple._syncOn) { if(TxControl.isBeforeCompletionWhenRollbackOnly()) { try { if (_synchs != null) doBeforeCompletion(); } catch (Exception e) { } } } else { _synchs = null; } if (parentTransaction != null) { parentTransaction.removeChildAction(this); } super.Abort(); if (ArjunaTransactionImple._syncOn) { try { if (_synchs != null) { currentStatus = determineStatus(this); doAfterCompletion(currentStatus); } } catch (Exception e) { } } destroyAction(); status = super.status(); } else if ((status == ActionStatus.ABORTING) || (status == ActionStatus.ABORTED) || (status == ActionStatus.H_ROLLBACK)) { <START> return; <END> } else { throw new INVALID_TRANSACTION(0, CompletionStatus.COMPLETED_NO); } switch (status) { case ActionStatus.ABORTING: case ActionStatus.ABORTED: case ActionStatus.H_ROLLBACK: return; case ActionStatus.PREPARING: case ActionStatus.PREPARED: case ActionStatus.COMMITTING: case ActionStatus.COMMITTED: case ActionStatus.H_COMMIT: case ActionStatus.H_MIXED: case ActionStatus.H_HAZARD: throw new INVALID_TRANSACTION(0, CompletionStatus.COMPLETED_NO); case ActionStatus.INVALID: case ActionStatus.CLEANUP: throw new UNKNOWN(ExceptionCodes.UNKNOWN_EXCEPTION, CompletionStatus.COMPLETED_MAYBE); } }</code><technical_language>If agree check TerminationTest outputs info message</technical_language>

Target:
public void rollback () throws SystemException { if (jtsLogger.logger.isTraceEnabled()) { jtsLogger.logger.trace("ArjunaTransactionImple::rollback for " + get_uid()); } if (ArjunaTransactionImple._checkedTransactions && !checkAccess()) { throw new NO_PERMISSION(0, CompletionStatus.COMPLETED_NO); } int status = super.status(); if ((status == ActionStatus.RUNNING) || (status == ActionStatus.ABORT_ONLY)) { if (ArjunaTransactionImple._syncOn) { if(TxControl.isBeforeCompletionWhenRollbackOnly()) { try { if (_synchs != null) doBeforeCompletion(); } catch (Exception e) { } } } else { _synchs = null; } if (parentTransaction != null) { parentTransaction.removeChildAction(this); } super.Abort(); if (ArjunaTransactionImple._syncOn) { try { if (_synchs != null) { currentStatus = determineStatus(this); doAfterCompletion(currentStatus); } } catch (Exception e) { } } destroyAction(); status = super.status(); } else if ((status == ActionStatus.ABORTING) || (status == ActionStatus.ABORTED) || (status == ActionStatus.H_ROLLBACK)) { if (jtsLogger.logger.isInfoEnabled()) { jtsLogger.i18NLogger.info_rollback_aborted_transaction(get_transaction_name()); } return; } else { throw new INVALID_TRANSACTION(0, CompletionStatus.COMPLETED_NO); } switch (status) { case ActionStatus.ABORTING: case ActionStatus.ABORTED: case ActionStatus.H_ROLLBACK: return; case ActionStatus.PREPARING: case ActionStatus.PREPARED: case ActionStatus.COMMITTING: case ActionStatus.COMMITTED: case ActionStatus.H_COMMIT: case ActionStatus.H_MIXED: case ActionStatus.H_HAZARD: throw new INVALID_TRANSACTION(0, CompletionStatus.COMPLETED_NO); case ActionStatus.INVALID: case ActionStatus.CLEANUP: throw new UNKNOWN(ExceptionCodes.UNKNOWN_EXCEPTION, CompletionStatus.COMPLETED_MAYBE); } }