/**
   * Commit the current transaction, writing any unflushed changes to the database.
   *
   * @throws IllegalStateException if isActive() is false.
   * @throws RollbackException if the commit fails.
   */
  public void commit() {
    assertActive();

    if (tx.getRollbackOnly()) {
      // This is thrown by the underlying transaction but we want to have a RollbackException here
      // so intercept it
      if (NucleusLogger.TRANSACTION.isDebugEnabled()) {
        NucleusLogger.TRANSACTION.debug(Localiser.msg("015020"));
      }
      throw new RollbackException(Localiser.msg("015020"));
    }

    try {
      tx.commit();
    } catch (NucleusTransactionException nte) {
      Throwable cause = nte.getCause();
      Throwable pe = null;
      if (cause instanceof NucleusException) {
        pe = NucleusJPAHelper.getJPAExceptionForNucleusException((NucleusException) cause);
      } else {
        pe = cause;
      }
      throw new RollbackException(Localiser.msg("015007"), pe);
    } catch (NucleusException ne) {
      throw NucleusJPAHelper.getJPAExceptionForNucleusException(ne);
    }
  }
 /* (non-Javadoc)
  * @see org.datanucleus.jta.TransactionManagerLocator#getTransactionManager(org.datanucleus.ClassLoaderResolver)
  */
 public TransactionManager getTransactionManager(ClassLoaderResolver clr) {
   Class cls = clr.classForName("com.atomikos.icatch.jta.UserTransactionManager");
   try {
     return (TransactionManager) cls.newInstance();
   } catch (Exception e) {
     NucleusLogger.TRANSACTION.debug(
         "Exception obtaining Atomikos transaction manager " + e.getMessage());
     return null;
   }
 }