{"record":{"id":"506a2291b89cdfb3","repo":"quarkusio/quarkus","slug":"the-narayana-jta-extension-is-configured-to-use-th-506a22","errorCode":null,"errorMessage":"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.","messagePattern":"The Narayana JTA extension is configured to use the '(.+?)' JDBC datasource as the transaction log storage, but that datasource does not have transaction capabilities disabled\\. To solve this, please set '(.+?)=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\\.","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"critical","filePath":"extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/NarayanaJtaRecorder.java","lineNumber":183,"sourceCode":"                                    + \" by setting property 'quarkus.transaction-manager.object-store.datasource' to the name of a configured datasource.\");\n                }\n                objectStoreDataSourceName = DataSourceUtil.DEFAULT_DATASOURCE_NAME;\n            } else {\n                objectStoreDataSourceName = transactions.getValue().objectStore().datasource().get();\n\n                if (!configuredDataSourcesConfigKeys.keySet().contains(objectStoreDataSourceName)) {\n                    throw new ConfigurationException(\n                            \"The Narayana JTA extension is configured to use the datasource '\"\n                                    + objectStoreDataSourceName\n                                    + \"' but that datasource is not configured.\"\n                                    + \" To solve this, either configure datasource \" + objectStoreDataSourceName\n                                    + \" referring to https://quarkus.io/guides/datasource for guidance,\"\n                                    + \" or configure another datasource to use in the Narayana JTA extension \"\n                                    + \" by setting property 'quarkus.transaction-manager.object-store.datasource' to the name of a configured datasource.\");\n                }\n            }\n            if (dataSourcesWithTransactionIntegration.contains(objectStoreDataSourceName)) {\n                throw new ConfigurationException(String.format(\n                        \"The Narayana JTA extension is configured to use the '%s' JDBC \"\n                                + \"datasource as the transaction log storage, \"\n                                + \"but that datasource does not have transaction capabilities disabled. \"\n                                + \"To solve this, please set '%s=disabled', or configure another datasource \"\n                                + \"with disabled transaction capabilities as the JDBC object store. \"\n                                + \"Please refer to the https://quarkus.io/guides/transaction#jdbcstore for more information.\",\n                        objectStoreDataSourceName, configuredDataSourcesConfigKeys.get(objectStoreDataSourceName)));\n            }\n        }\n        boolean recoveryEnabled = transactions.getValue().enableRecovery().orElse(xaResourcesPresent);\n        if (!recoveryEnabled) {\n            return;\n        }\n        QuarkusRecoveryService.getInstance().create();\n        QuarkusRecoveryService.getInstance().start();\n        context.addShutdownTask(() -> {\n            try {\n                QuarkusRecoveryService.getInstance().stop();","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/narayana-jta/runtime/src/main/java/io/quarkus/narayana/jta/runtime/NarayanaJtaRecorder.java#L165-L201","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"# before\nquarkus.transaction-manager.object-store.type=jdbc\n# after\nquarkus.datasource.\"tx-log\".db-kind=postgresql\nquarkus.datasource.\"tx-log\".jdbc.url=jdbc:postgresql://localhost:5432/txlog\nquarkus.datasource.\"tx-log\".transactions=disabled\nquarkus.transaction-manager.object-store.type=jdbc\nquarkus.transaction-manager.object-store.datasource=tx-log","handlingStrategy":"validation","validationCode":"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);","typeGuard":null,"tryCatchPattern":"try { app.start(); } catch (ConfigurationException e) { if (e.getMessage().contains(\"transaction capabilities disabled\")) { /* set transactions=disabled on the object-store datasource */ } throw e; }","preventionTips":["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"],"tags":["narayana-jta","configuration","datasource","object-store","transactions","startup"],"backgroundTag":"datasource-misconfigured-transactions","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}