{"record":{"id":"d3b9465a70e4fa93","repo":"apache/shardingsphere","slug":"0-d3b946","errorCode":"0","errorMessage":"Invalid 'Transaction' rule, error message is: Unsupported transaction type `%s`","messagePattern":"Invalid 'Transaction' rule, error message is: Unsupported transaction type `(.+?)`","errorType":"exception","errorClass":"InvalidRuleConfigurationException","httpStatus":null,"severity":"error","filePath":"kernel/transaction/distsql/handler/src/main/java/org/apache/shardingsphere/transaction/distsql/handler/update/AlterTransactionRuleExecutor.java","lineNumber":51,"sourceCode":"/**\n * Alter transaction rule executor.\n */\npublic final class AlterTransactionRuleExecutor implements GlobalRuleDefinitionExecutor<AlterTransactionRuleStatement, TransactionRule> {\n    \n    @Override\n    public void checkBeforeUpdate(final AlterTransactionRuleStatement sqlStatement) {\n        checkTransactionType(sqlStatement);\n        TransactionType transactionType = TransactionType.valueOf(sqlStatement.getDefaultType().toUpperCase());\n        if (TransactionType.LOCAL != transactionType) {\n            checkTransactionManager(sqlStatement, transactionType);\n        }\n    }\n    \n    private void checkTransactionType(final AlterTransactionRuleStatement statement) {\n        try {\n            TransactionType.valueOf(statement.getDefaultType().toUpperCase());\n        } catch (final IllegalArgumentException ignored) {\n            throw new InvalidRuleConfigurationException(\"Transaction\", String.format(\"Unsupported transaction type `%s`\", statement.getDefaultType()));\n        }\n    }\n    \n    private void checkTransactionManager(final AlterTransactionRuleStatement statement, final TransactionType transactionType) {\n        Collection<ShardingSphereDistributedTransactionManager> distributedTransactionManagers = ShardingSphereServiceLoader.getServiceInstances(ShardingSphereDistributedTransactionManager.class);\n        Optional<ShardingSphereDistributedTransactionManager> distributedTransactionManager =\n                distributedTransactionManagers.stream().filter(each -> transactionType == each.getTransactionType()).findFirst();\n        ShardingSpherePreconditions.checkState(distributedTransactionManager.isPresent(),\n                () -> new InvalidRuleConfigurationException(\"Transaction\", String.format(\"No transaction manager with type `%s`\", statement.getDefaultType())));\n        if (TransactionType.XA == transactionType) {\n            checkTransactionManagerProviderType(distributedTransactionManager.get(), statement.getProvider().getProviderType());\n        }\n    }\n    \n    private void checkTransactionManagerProviderType(final ShardingSphereDistributedTransactionManager distributedTransactionManager, final String providerType) {\n        ShardingSpherePreconditions.checkState(distributedTransactionManager.containsProviderType(providerType),\n                () -> new InvalidRuleConfigurationException(\"Transaction\", String.format(\"No transaction manager provider with type `%s`\", providerType)));\n    }","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/apache/shardingsphere/blob/e952770a215630a3659c75d64369168cd3e26b82/kernel/transaction/distsql/handler/src/main/java/org/apache/shardingsphere/transaction/distsql/handler/update/AlterTransactionRuleExecutor.java#L33-L69","documentation":"AlterTransactionRuleExecutor validates ALTER TRANSACTION RULE DistSQL before applying it and calls TransactionType.valueOf on DEFAULT_TYPE. If the value is not exactly LOCAL, XA, or BASE (case-insensitive), valueOf throws IllegalArgumentException, which is wrapped into InvalidRuleConfigurationException with the message 'Invalid Transaction rule, error message is: Unsupported transaction type `<type>`'.","triggerScenarios":"Executing ALTER TRANSACTION RULE ... DEFAULT_TYPE=<value> through ShardingSphere proxy DistSQL where <value> is something like 'XA_MYSQL', 'jdbc', 'none', 'local_trx', or misspelled; checkTransactionType catches the IllegalArgumentException and rethrows the InvalidRuleConfigurationException.","commonSituations":"Confusing the transaction provider name (e.g. Atomikos, Narayana, Bitronix) with the transaction type; copying example DistSQL with a made-up type; older/newer docs using different type names; trailing whitespace or quotes in the value.","solutions":["Use one of the supported DEFAULT_TYPE values: LOCAL, XA, or BASE (case-insensitive).","If you intended a specific XA provider, keep DEFAULT_TYPE=XA and put the provider in the PROVIDER clause, e.g. ALTER TRANSACTION RULE ... DEFAULT_TYPE=XA, PROVIDER(TYPE=Narayana).","Check for typos, extra quotes, or whitespace in the DistSQL string before resubmitting.","Run SHOW TRANSACTION RULES first to confirm the current rule and syntax on your version."],"exampleFix":"-- before\nALTER TRANSACTION RULE DEFAULT_TYPE=\"XA_ATOMIKOS\", PROVIDER(TYPE=Atomikos);\n\n-- after\nALTER TRANSACTION RULE DEFAULT_TYPE=XA, PROVIDER(TYPE=Atomikos);","handlingStrategy":"validation","validationCode":"Set<String> VALID = Set.of(\"LOCAL\", \"XA\", \"BASE\");\nString t = defaultType.trim().toUpperCase(Locale.ROOT);\nif (!VALID.contains(t)) throw new IllegalArgumentException(\"DEFAULT_TYPE must be one of LOCAL, XA, BASE: \" + defaultType);","typeGuard":null,"tryCatchPattern":"try { proxy.executeSql(\"ALTER TRANSACTION RULE DEFAULT_TYPE=\" + type + \";\"); } catch (final InvalidRuleConfigurationException ex) { /* surface message listing supported types; fix DEFAULT_TYPE */ }","preventionTips":["Whitelist DEFAULT_TYPE to LOCAL/XA/BASE in any tooling that generates DistSQL.","Do not put provider names (Atomikos/Narayana/Bitronix) in DEFAULT_TYPE; they belong in PROVIDER(TYPE=...).","Run SHOW TRANSACTION RULES to confirm syntax before ALTER."],"tags":["distsql","transaction","configuration","validation","proxy"],"backgroundTag":null,"analyzedSha":"e952770a215630a3659c75d64369168cd3e26b82","analyzedAt":"2026-08-14T13:54:53.392Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}