flowable/flowable-engine · error · TransactionException

Unable to commit transaction

Error message

Unable to commit transaction

What it means

Wrapper thrown by JtaTransactionInterceptor.doCommit: committing the JTA transaction failed with a rollback/heuristic exception (e.g. HeuristicMixedException, RollbackException), so the command's changes were not durably committed.

Solutions

  1. Inspect the cause to see whether a rollback or heuristic outcome occurred
  2. Resolve concurrent-update or timeout conditions that force the rollback
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/interceptor/JtaTransactionInterceptor.java:121 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/ab12fa6f348be92c. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/interceptor/JtaTransactionInterceptor.java:121

            throw new TransactionException("Unable to suspend transaction", e);
        }
    }

    private void doResume(Transaction tx) {
        if (tx != null) {
            try {
                transactionManager.resume(tx);
            } catch (SystemException | InvalidTransactionException e) {
                throw new TransactionException("Unable to resume transaction", e);
            }
        }
    }

    private void doCommit() {
        try {
            transactionManager.commit();
        } catch (HeuristicMixedException | SystemException | RollbackException | HeuristicRollbackException e) {
            throw new TransactionException("Unable to commit transaction", e);
        } catch (RuntimeException | Error e) {
            doRollback(true, e);
            throw e;
        }
    }

    private void doRollback(boolean isNew, Throwable originalException) {
        Throwable rollbackEx = null;
        try {
            if (isNew) {
                transactionManager.rollback();
            } else {
                transactionManager.setRollbackOnly();
            }
        } catch (SystemException e) {
            LOGGER.debug("Error when rolling back transaction", e);
        } catch (RuntimeException | Error e) {
            rollbackEx = e;

View on GitHub (pinned to d6d39ce1c6)