{"record":{"id":"7518425c7d4a16da","repo":"pentaho/pentaho-kettle","slug":"database-exception-unabletoreleasesavepoint","errorCode":null,"errorMessage":"Database.Exception.UnableToReleaseSavepoint","messagePattern":"Database\\.Exception\\.UnableToReleaseSavepoint","errorType":"exception","errorClass":"KettleDatabaseException","httpStatus":null,"severity":"warning","filePath":"core/src/main/java/org/pentaho/di/core/database/Database.java","lineNumber":5106,"sourceCode":"      throw new KettleDatabaseException(\n        BaseMessages.getString( PKG, \"Database.Exception.UnableToSetSavepoint\" ), e );\n    }\n  }\n\n  public Savepoint setSavepoint( String savePointName ) throws KettleDatabaseException {\n    try {\n      return connection.setSavepoint( savePointName );\n    } catch ( SQLException e ) {\n      throw new KettleDatabaseException( BaseMessages.getString(\n        PKG, \"Database.Exception.UnableToSetSavepointName\", savePointName ), e );\n    }\n  }\n\n  public void releaseSavepoint( Savepoint savepoint ) throws KettleDatabaseException {\n    try {\n      connection.releaseSavepoint( savepoint );\n    } catch ( SQLException e ) {\n      throw new KettleDatabaseException( BaseMessages.getString(\n        PKG, \"Database.Exception.UnableToReleaseSavepoint\" ), e );\n    }\n  }\n\n  public void rollback( Savepoint savepoint ) throws KettleDatabaseException {\n    try {\n      connection.rollback( savepoint );\n    } catch ( SQLException e ) {\n      throw new KettleDatabaseException( BaseMessages.getString(\n        PKG, \"Database.Exception.UnableToRollbackToSavepoint\" ), e );\n    }\n  }\n\n  public Object getParentObject() {\n    return parentLoggingObject;\n  }\n\n  /**","sourceCodeStart":5088,"sourceCodeEnd":5124,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/database/Database.java#L5088-L5124","documentation":"Thrown by Database.releaseSavepoint(Savepoint) (Database.java:5106) when connection.releaseSavepoint() fails with a SQLException. Releasing a savepoint discards it so its undo no longer applies; failure usually means the savepoint or transaction is no longer valid.","triggerScenarios":"Calling Database.releaseSavepoint() after the transaction was already committed/rolled back, after the savepoint was already released, or with a savepoint from a different/closed connection.","commonSituations":"Committing then still releasing the savepoint; rolling back to a savepoint then releasing it (already invalidated); connection pool returning the connection mid-transaction; distributed XA connections where savepoints are unsupported.","solutions":["Only release savepoints while the same transaction is still active (before commit/rollback)","Track savepoint state and skip release when it was already invalidated by rollback(savepoint)","Guard the release in try-catch and log — a failed release is rarely fatal after a successful rollback","Ensure the Savepoint object originated from this same connection","Check driver support for savepoints before using them"],"exampleFix":"// before\nconnection.commit();\ndatabase.releaseSavepoint( savepoint );\n// after\nif ( savepoint != null && !transactionFinished ) {\n  database.releaseSavepoint( savepoint );\n}\ndatabase.commit();","handlingStrategy":"try-catch","validationCode":"boolean canRelease = savepoint != null && !transactionCommitted && !transactionRolledBack;\nif ( canRelease ) {\n  database.releaseSavepoint( savepoint );\n}","typeGuard":null,"tryCatchPattern":"try {\n  database.releaseSavepoint( savepoint );\n} catch ( KettleDatabaseException e ) {\n  log.debug( \"Savepoint release failed (already invalidated?)\", e ); // non-fatal after rollback\n}","preventionTips":["Track transaction state; never release after commit/rollback","Treat release failures as non-fatal cleanup issues","Reuse savepoints only within the same connection","Avoid savepoints on XA/distributed connections"],"tags":["jdbc","database","transaction","savepoint"],"backgroundTag":"database-query-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}