quarkusio/quarkus · critical · ConfigurationException

The Narayana JTA extension is configured to use the '%s' JDB

Error message

The Narayana JTA extension is configured to use the '%s' JDBC datasource as the transaction log storage, but that datasource does not have transaction capabilities disabled. To solve this, please set '%s=disabled', or configure another datasource with disabled transaction capabilities as the JDBC object store. Please refer to the https://quarkus.io/guides/transaction#jdbcstore for more information.

What it means

The JDBC object store datasource must have its own transaction integration disabled (quarkus.datasource."<name>".transactions=disabled), otherwise storing transaction logs through it would recurse into the same transaction manager. When the chosen datasource still has transaction capabilities enabled, the recorder throws this ConfigurationException at startup.

Source

Thrown at extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/NarayanaJtaRecorder.java:183

                                    + " by setting property 'quarkus.transaction-manager.object-store.datasource' to the name of a configured datasource.");
                }
                objectStoreDataSourceName = DataSourceUtil.DEFAULT_DATASOURCE_NAME;
            } else {
                objectStoreDataSourceName = transactions.getValue().objectStore().datasource().get();

                if (!configuredDataSourcesConfigKeys.keySet().contains(objectStoreDataSourceName)) {
                    throw new ConfigurationException(
                            "The Narayana JTA extension is configured to use the datasource '"
                                    + objectStoreDataSourceName
                                    + "' but that datasource is not configured."
                                    + " To solve this, either configure datasource " + objectStoreDataSourceName
                                    + " referring to https://quarkus.io/guides/datasource for guidance,"
                                    + " or configure another datasource to use in the Narayana JTA extension "
                                    + " by setting property 'quarkus.transaction-manager.object-store.datasource' to the name of a configured datasource.");
                }
            }
            if (dataSourcesWithTransactionIntegration.contains(objectStoreDataSourceName)) {
                throw new ConfigurationException(String.format(
                        "The Narayana JTA extension is configured to use the '%s' JDBC "
                                + "datasource as the transaction log storage, "
                                + "but that datasource does not have transaction capabilities disabled. "
                                + "To solve this, please set '%s=disabled', or configure another datasource "
                                + "with disabled transaction capabilities as the JDBC object store. "
                                + "Please refer to the https://quarkus.io/guides/transaction#jdbcstore for more information.",
                        objectStoreDataSourceName, configuredDataSourcesConfigKeys.get(objectStoreDataSourceName)));
            }
        }
        boolean recoveryEnabled = transactions.getValue().enableRecovery().orElse(xaResourcesPresent);
        if (!recoveryEnabled) {
            return;
        }
        QuarkusRecoveryService.getInstance().create();
        QuarkusRecoveryService.getInstance().start();
        context.addShutdownTask(() -> {
            try {
                QuarkusRecoveryService.getInstance().stop();

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set quarkus.datasource."<name>".transactions=disabled on the object-store datasource
  2. Better: create a dedicated datasource for transaction logs with transactions=disabled and set quarkus.transaction-manager.object-store.datasource to it
  3. Do not use the application's main business datasource as the object store

Example fix

# before
quarkus.transaction-manager.object-store.type=jdbc
# after
quarkus.datasource."tx-log".db-kind=postgresql
quarkus.datasource."tx-log".jdbc.url=jdbc:postgresql://localhost:5432/txlog
quarkus.datasource."tx-log".transactions=disabled
quarkus.transaction-manager.object-store.type=jdbc
quarkus.transaction-manager.object-store.datasource=tx-log
Defensive patterns

Strategy: validation

Validate before calling

String ds = ConfigProvider.getConfig().getValue("quarkus.transaction-manager.object-store.datasource", String.class); String txMode = ConfigProvider.getConfig().getOptionalValue("quarkus.datasource.\"" + ds + "\".transactions", String.class).orElse("enabled"); if (!"disabled".equals(txMode)) throw new IllegalStateException("object-store datasource must have transactions=disabled: " + ds);

Try / catch

try { app.start(); } catch (ConfigurationException e) { if (e.getMessage().contains("transaction capabilities disabled")) { /* set transactions=disabled on the object-store datasource */ } throw e; }

Prevention

When it happens

Trigger: quarkus.transaction-manager.object-store.type=jdbc with a datasource (default or named) whose quarkus.datasource[."<name>"].transactions is enabled or xa (the default), during startRecoveryService.

Common situations: Pointing the object store at the app's main business datasource without disabling transactions; forgetting the per-named-datasource transactions key; upgrading Quarkus where this validation became stricter.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/506a2291b89cdfb3. Report an issue: GitHub.