{"record":{"id":"6453ef69ba994699","repo":"apache/cassandra","slug":"transaction-contains-multiple-updates-to-the-same","errorCode":null,"errorMessage":"Transaction contains multiple updates to the same key and fields","messagePattern":"Transaction contains multiple updates to the same key and fields","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java","lineNumber":420,"sourceCode":"            idx++;\n        }\n        return fragments;\n    }\n\n    private static void validateOnlyModifyPrimaryKeyColumnPairOnce(HashMap<Object, Columns> seenColumns,\n                                                                   ModificationStatement statement, List<TxnWrite.Fragment> writeFragments)\n    {\n        Columns regularColumns = statement.updatedColumns().columns(false);\n        statement.forEachRowKey(writeFragments, seenColumns, regularColumns, TransactionStatement::mergeColumnsIfNoDuplicates);\n        Columns staticColumns = statement.updatedColumns().columns(true);\n        statement.forEachPartitionKey(writeFragments, seenColumns, staticColumns, TransactionStatement::mergeColumnsIfNoDuplicates);\n    }\n\n    private static Columns mergeColumnsIfNoDuplicates(Columns existing, Columns add)\n    {\n        Columns merged = existing.mergeTo(add);\n        if (merged.size() != existing.size() + add.size())\n            throw invalidRequest(DUPLICATE_KEYS_IN_SAME_TRANSACTION_MESSAGE);\n        return merged;\n    }\n\n    private ConsistencyLevel consistencyLevelForAccordRead(ClusterMetadata cm, TableMetadatas.Complete tables, Keys keys, @Nullable ConsistencyLevel consistencyLevel)\n    {\n        // Write transactions are read/write so it creates a read and ends up needing a consistency level\n        // which is fine to leave null\n        if (keys.isEmpty())\n            return null;\n\n        // Null means no specific consistency behavior is required from Accord, it's functionally similar to\n        // reading at ONE if you are reading data that wasn't written via Accord\n        if (consistencyLevel == null)\n            return null;\n\n        for (Key key : keys)\n        {\n            // readCLForMode should return either null or the supplied consistency level","sourceCodeStart":402,"sourceCodeEnd":438,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java#L402-L438","documentation":"TransactionStatement.mergeColumnsIfNoDuplicates merges the Columns touched by two transaction operations and throws InvalidRequestException (with DUPLICATE_KEYS_IN_SAME_TRANSACTION_MESSAGE) when the merged set is smaller than the sum of sizes, proving the same key/field was updated more than once in the transaction. Transactions must not contain conflicting duplicate writes.","triggerScenarios":"A transaction (LET/UPDATE/OBJECT-style statement) performs two updates affecting the same primary-key row and the same columns, e.g. two UPDATEs to the same partition/row keys and overlapping fields.","commonSituations":"Repeating the same row update twice in one transaction block; variable bindings causing two LET-bound updates to collapse onto the same key; copy-paste duplication in transaction bodies.","solutions":["Remove the duplicated update to the same key and fields from the transaction","Merge the two updates into a single UPDATE setting all needed fields once","If updates must combine values, do it in one statement (e.g. set both columns in one UPDATE) rather than two sequential statements"],"exampleFix":"// before\nBEGIN TRANSACTION\n  UPDATE t SET v = 1 WHERE pk = 1;\n  UPDATE t SET v = 2 WHERE pk = 1; -- duplicate key+field\nCOMMIT TRANSACTION\n// after\nBEGIN TRANSACTION\n  UPDATE t SET v = 2 WHERE pk = 1;\nCOMMIT TRANSACTION","handlingStrategy":"validation","validationCode":"// track (key, field) pairs in the transaction before submitting\nSet<String> seen = new HashSet<>();\nfor (Update u : updates) { String k = u.key() + \":\" + u.field(); if (!seen.add(k)) throw new IllegalArgumentException(\"duplicate update \" + k); }","typeGuard":null,"tryCatchPattern":"try { session.execute(txnStatement); }\ncatch (InvalidRequestException e) { if (e.getMessage().contains(\"multiple updates\")) { /* deduplicate transaction body */ } }","preventionTips":["Review transaction bodies for repeated row updates","Merge multi-field writes into a single UPDATE","Watch for variable bindings that collapse distinct updates onto the same key"],"tags":["cql","transactions","duplicate-write","validation"],"backgroundTag":"invalid-state-transition","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}