{"record":{"id":"4efc56365b8a1347","repo":"prestodb/presto","slug":"not-in-transaction","errorCode":"NOT_IN_TRANSACTION","errorMessage":"No transaction in progress","messagePattern":"No transaction in progress","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/execution/CommitTask.java","lineNumber":44,"sourceCode":"import java.util.List;\n\nimport static com.facebook.presto.spi.StandardErrorCode.NOT_IN_TRANSACTION;\n\npublic class CommitTask\n        implements SessionTransactionControlTask<Commit>\n{\n    @Override\n    public String getName()\n    {\n        return \"COMMIT\";\n    }\n\n    @Override\n    public ListenableFuture<?> execute(Commit statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, QueryStateMachine stateMachine, List<Expression> parameters, String query)\n    {\n        Session session = stateMachine.getSession();\n        if (!session.getTransactionId().isPresent()) {\n            throw new PrestoException(NOT_IN_TRANSACTION, \"No transaction in progress\");\n        }\n        TransactionId transactionId = session.getTransactionId().get();\n\n        stateMachine.clearTransactionId();\n        return transactionManager.asyncCommit(transactionId);\n    }\n}\n","sourceCodeStart":26,"sourceCodeEnd":52,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/execution/CommitTask.java#L26-L52","documentation":"COMMIT was executed but the session has no open transaction. CommitTask.execute checks session.getTransactionId().isPresent() and throws NOT_IN_TRANSACTION if absent, because there is no transaction to commit.","triggerScenarios":"Running COMMIT without a preceding START TRANSACTION in the same session; running COMMIT after an implicit auto-commit of the previous statement; issuing COMMIT twice (the first COMMIT clears the session transaction id via stateMachine.clearTransactionId()); session transaction id was cleared by a prior commit or rollback.","commonSituations":"Client drivers with autocommit enabled issuing manual COMMIT; scripts that unconditionally COMMIT; retry logic resending COMMIT after a connection drop mid-transaction; mixing session-scoped transaction state across pooled connections.","solutions":["Start a transaction first: START TRANSACTION; ... ; COMMIT","Remove the stray COMMIT if autocommit is desired — each statement commits on its own","Check driver/session autocommit settings so COMMIT is only sent when a transaction was explicitly started","Guard application logic with a transaction-active flag before sending COMMIT"],"exampleFix":"// before\nConnection c = driver.connect(...); // autocommit on\nstmt.execute(\"COMMIT\");\n// after\nstmt.execute(\"START TRANSACTION\");\nstmt.execute(\"INSERT ...\");\nstmt.execute(\"COMMIT\");","handlingStrategy":"try-catch","validationCode":"// track transaction state client-side\nif (!sessionState.isInTransaction()) {\n    throw new IllegalStateException(\"COMMIT skipped: no transaction in progress\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    stmt.execute(\"COMMIT\");\n} catch (PrestoSQLException e) {\n    if (\"NOT_IN_TRANSACTION\".equals(e.getErrorCodeName())) {\n        // no-op or log: transaction already closed\n    } else throw e;\n}","preventionTips":["Always pair START TRANSACTION / COMMIT in the same session and code path","Avoid mixing autocommit and manual transaction control","Track transaction state in your connection wrapper before issuing COMMIT","Handle reconnects by re-checking transaction state rather than blindly resending COMMIT"],"tags":["transaction","sql","autocommit"],"backgroundTag":"no-transaction-in-progress","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}