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
- Set quarkus.datasource."<name>".transactions=disabled on the object-store datasource
- Better: create a dedicated datasource for transaction logs with transactions=disabled and set quarkus.transaction-manager.object-store.datasource to it
- 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
- Always use a dedicated datasource for the JDBC object store with transactions=disabled
- Never point the object store at the main business datasource
- Document the transactions=disabled requirement next to the object-store config
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
- The Narayana JTA extension does not have a datasource config
- The Narayana JTA extension is configured to use the datasour
- JDBC Store configured but the '%s' datasource is not configu
- Unable to find top command. Ensure you have a @CommandDefini
- No datasource named '<dataSourceName>' exists
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/506a2291b89cdfb3.
Report an issue: GitHub.