{"record":{"id":"39d35848d981f5c5","repo":"apache/cassandra","slug":"counter-columns-cannot-be-accessed-within-a-transa","errorCode":null,"errorMessage":"Counter columns cannot be accessed within a transaction; %s statement %s","messagePattern":"Counter columns cannot be accessed within a transaction; (.+?) statement (.+?)","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java","lineNumber":710,"sourceCode":"        return false;\n    }\n\n    private static void validate(SelectStatement.RawStatement select)\n    {\n        if (select.parameters.orderings != null && !select.parameters.orderings.isEmpty())\n            throw invalidRequest(NO_ORDER_BY_IN_TXNS_MESSAGE, \"SELECT\", select.source);\n        if (select.parameters.groups != null && !select.parameters.groups.isEmpty())\n            throw invalidRequest(NO_GROUP_BY_IN_TXNS_MESSAGE, \"SELECT\", select.source);\n    }\n\n    private static void validate(SelectStatement prepared)\n    {\n        if (!prepared.table.isAccordEnabled())\n            throw invalidRequest(TRANSACTIONS_DISABLED_ON_TABLE_MESSAGE, \"SELECT\", prepared.source);\n        if (prepared.table.params.pendingDrop)\n            throw invalidRequest(TRANSACTIONS_DISABLED_ON_TABLE_BEING_DROPPED_MESSAGE, \"SELECT\", prepared.source);\n        if (prepared.table.isCounter())\n            throw invalidRequest(NO_COUNTERS_IN_TXNS_MESSAGE, \"SELECT\", prepared.source);\n        if (prepared.hasAggregation())\n            throw invalidRequest(NO_AGGREGATION_IN_TXNS_MESSAGE, \"SELECT\", prepared.source);\n\n        // when \"LIMIT ?\" this check can't be performed, so need to do again once the options are known\n        if (prepared.getRestrictions().keyIsInRelation())\n            checkTrue(prepared.isLimitMarker() || prepared.getLimit(null) == DataLimits.NO_LIMIT, NO_PARTITION_IN_CLAUSE_WITH_LIMIT, \"SELECT\", prepared.source);\n    }\n\n    public static class Parsed extends QualifiedStatement.Composite\n    {\n        private final List<SelectStatement.RawStatement> assignments;\n        private final SelectStatement.RawStatement select;\n        private final List<RowDataReference.Raw> returning;\n        private final List<ModificationStatement.Parsed> updates;\n        private final List<ConditionStatement.Raw> conditions;\n        private final List<RowDataReference.Raw> dataReferences;\n\n        public Parsed(List<SelectStatement.RawStatement> assignments,","sourceCodeStart":692,"sourceCodeEnd":728,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java#L692-L728","documentation":"Counter tables cannot be read (or written) inside Accord transactions; the transaction engine does not support counter columns. For SELECTs, TransactionStatement.validate(SelectStatement) throws when prepared.table.isCounter().","triggerScenarios":"A SELECT within BEGIN TRANSACTION ... COMMIT targets a COUNTER table.","commonSituations":"Mixing counter increment logic into a transaction; retrofitting a legacy counter table into Accord-based workflows.","solutions":["Move counter reads/writes out of the transaction","Migrate to non-counter columns (e.g., plain longs with CAS or a txn-managed value) if atomic combined semantics are needed","Restructure the schema so counters and transactional data use separate tables and separate code paths"],"exampleFix":"// before\nBEGIN TRANSACTION SELECT c FROM counter_t WHERE pk = 1; COMMIT;\n// after\nSELECT c FROM counter_t WHERE pk = 1; // outside any transaction","handlingStrategy":"validation","validationCode":"TableMetadata t = cluster.getMetadata().getKeyspace(ks).getTable(table); if (t.getOptions().getCounter()) throw new IllegalStateException(\"counters cannot be used in transactions: \" + table);","typeGuard":null,"tryCatchPattern":"try { session.execute(txnCql); } catch (InvalidRequestException e) { if (e.getMessage().contains(\"Counter columns cannot be accessed within a transaction\")) { /* route to non-transactional path */ } else throw e; }","preventionTips":["Keep counter tables outside transaction code paths","Migrate counters to regular columns if transactional semantics are required","Document per-table capability (counter vs transactional) in schema ownership docs"],"tags":["cql","accord","counters","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}