Index: modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java =================================================================== --- modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java (revision 6522) +++ modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java (working copy) @@ -413,7 +413,7 @@ Service service = services.getPersistenceService(); if (service instanceof DbPersistenceService) { DbPersistenceService persistenceService = (DbPersistenceService) service; - return persistenceService.isTransactionActive() || persistenceService.getTransaction() == null; + return persistenceService.isTransactionActive() || !persistenceService.isTransactionExisting(); } } } Index: modules/core/src/main/java/org/jbpm/persistence/db/DbPersistenceService.java =================================================================== --- modules/core/src/main/java/org/jbpm/persistence/db/DbPersistenceService.java (revision 6522) +++ modules/core/src/main/java/org/jbpm/persistence/db/DbPersistenceService.java (working copy) @@ -196,6 +196,10 @@ } return connection; } + + public boolean isTransactionExisting() { + return transaction != null; + } public boolean isTransactionActive() { return transaction != null && transaction.isActive(); Index: modules/core/src/main/java/org/jbpm/persistence/jta/JtaDbPersistenceService.java =================================================================== --- modules/core/src/main/java/org/jbpm/persistence/jta/JtaDbPersistenceService.java (revision 6522) +++ modules/core/src/main/java/org/jbpm/persistence/jta/JtaDbPersistenceService.java (working copy) @@ -21,7 +21,10 @@ */ package org.jbpm.persistence.jta; +import javax.transaction.Status; import javax.transaction.SystemException; +import javax.transaction.Transaction; +import javax.transaction.TransactionManager; import javax.transaction.UserTransaction; import org.apache.commons.logging.Log; @@ -48,9 +51,22 @@ } public boolean isTransactionActive() { - return isJtaTransactionInProgress(); + Transaction t = getJtaTransaction(); + try { + return (t != null) && (t.getStatus() == Status.STATUS_ACTIVE); + } catch (SystemException se) { + throw new JbpmException("could not obtain JTA Transaction status", se); + } } + public boolean isTransactionExisting() { + if (isTransactionExternallyManaged()) { + return getJtaTransaction() != null; + } else { + return super.isTransactionExisting(); + } + } + protected boolean isTransactionExternallyManaged() { return !isJtaTxCreated(); } @@ -105,6 +121,21 @@ } } + private Transaction getJtaTransaction() { + SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) getSessionFactory(); + TransactionManager tm = sessionFactory.getTransactionManager(); + try { + if (tm != null) { + Transaction t = tm.getTransaction(); + return t; + } else { + return null; + } + } catch (SystemException se) { + throw new JbpmException("could not obtain JTA Transaction", se); + } + } + public boolean isJtaTxCreated() { return userTransaction != null; }