{"record":{"id":"0465ab5012320d38","repo":"flowable/flowable-engine","slug":"there-are-results-size-event-definitions-with","errorCode":null,"errorMessage":"There are ${results.size()} event definitions with key = '${channelDefinitionKey}' and version = '${eventVersion}'.","messagePattern":"There are (.+?) event definitions with key = '(.+?)' and version = '(.+?)'\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/entity/data/impl/MybatisChannelDefinitionDataManager.java","lineNumber":117,"sourceCode":"    public ChannelDefinitionEntity findChannelDefinitionByDeploymentAndKeyAndTenantId(String deploymentId, String channelDefinitionKey, String tenantId) {\n        Map<String, Object> parameters = new HashMap<>();\n        parameters.put(\"deploymentId\", deploymentId);\n        parameters.put(\"channelDefinitionKey\", channelDefinitionKey);\n        parameters.put(\"tenantId\", tenantId);\n        return (ChannelDefinitionEntity) getDbSqlSession().selectOne(\"selectChannelDefinitionByDeploymentAndKeyAndTenantId\", parameters);\n    }\n    \n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public ChannelDefinitionEntity findChannelDefinitionByKeyAndVersion(String channelDefinitionKey, Integer eventVersion) {\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"channelDefinitionKey\", channelDefinitionKey);\n        params.put(\"eventVersion\", eventVersion);\n        List<ChannelDefinitionEntity> results = getDbSqlSession().selectList(\"selectChannelDefinitionsByKeyAndVersion\", params);\n        if (results.size() == 1) {\n            return results.get(0);\n        } else if (results.size() > 1) {\n            throw new FlowableException(\"There are \" + results.size() + \" event definitions with key = '\" + channelDefinitionKey + \"' and version = '\" + eventVersion + \"'.\");\n        }\n        return null;\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public ChannelDefinitionEntity findChannelDefinitionByKeyAndVersionAndTenantId(String channelDefinitionKey, Integer eventVersion, String tenantId) {\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"channelDefinitionKey\", channelDefinitionKey);\n        params.put(\"eventVersion\", eventVersion);\n        params.put(\"tenantId\", tenantId);\n        List<ChannelDefinitionEntity> results = getDbSqlSession().selectList(\"selectChannelDefinitionsByKeyAndVersionAndTenantId\", params);\n        if (results.size() == 1) {\n            return results.get(0);\n        } else if (results.size() > 1) {\n            throw new FlowableException(\"There are \" + results.size() + \" event definitions with key = '\" + channelDefinitionKey + \"' and version = '\" + eventVersion + \"' in tenant = '\" + tenantId + \"'.\");\n        }\n        return null;","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/entity/data/impl/MybatisChannelDefinitionDataManager.java#L99-L135","documentation":"Thrown by MybatisChannelDefinitionDataManager.findChannelDefinitionByKeyAndVersion when the query selectChannelDefinitionsByKeyAndVersion returns more than one row for a (key, version) pair. Since key+version should uniquely identify a channel definition, duplicates mean the data is inconsistent. Note the message misleadingly says 'event definitions' even for channels.","triggerScenarios":"More than one FLW_EV_CHANNEL_DEFINITION row shares the same KEY_ and VERSION_ — typically from concurrent deployments of the same channel model racing to insert the same version number.","commonSituations":"Multiple cluster nodes deploying the same channel resource simultaneously without unique constraints or synchronization; manual DB inserts; retry logic re-inserting after a partial commit.","solutions":["Find and remove the duplicate rows: SELECT * FROM FLW_EV_CHANNEL_DEFINITION WHERE KEY_ = ? AND VERSION_ > 1 order by ID_ and delete the extras.","Serialize deployments of the same key (e.g. distributed lock) so two nodes cannot insert the same version concurrently.","Add a unique DB constraint on (KEY_, VERSION_) (and TENANT_ID_ where applicable) to fail fast on duplicates.","Reconcile duplicates by keeping the definition whose DEPLOYMENT_ID_ matches the surviving deployment."],"exampleFix":"-- before (duplicates present)\nSELECT * FROM FLW_EV_CHANNEL_DEFINITION WHERE KEY_='myChannel' AND VERSION_=1;\n-- after: keep one row, delete others\nDELETE FROM FLW_EV_CHANNEL_DEFINITION WHERE KEY_='myChannel' AND VERSION_=1 AND ID_ != '<kept-id>';","handlingStrategy":"validation","validationCode":"long n = eventRepositoryService.createChannelDefinitionQuery()\n    .channelKey(key).channelDefinitionVersion(version).count();\nif (n > 1) throw new IllegalStateException(\"duplicate channel definitions for key \" + key + \" v\" + version + \", clean DB before lookup\");","typeGuard":null,"tryCatchPattern":"try {\n    ch = manager.findChannelDefinitionByKeyAndVersion(key, version);\n} catch (FlowableException e) {\n    ch = dedupeAndRetry(key, version); // remove duplicate rows, then retry\n}","preventionTips":["Add unique constraint on FLW_EV_CHANNEL_DEFINITION (KEY_, VERSION_).","Serialize deployments of the same channel key across cluster nodes.","Avoid manual inserts into event registry tables.","Run a duplicate-detection query as part of health checks."],"tags":["flowable","channel-definition","duplicate-data","database"],"backgroundTag":"database-query-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}