Zum Inhalt springen

Oracle/JDBC - Probleme mit Rollback und Savepoints


Empfohlene Beiträge

Geschrieben

Moin!

Ich programmiere ein Migrationstool, das eine Oracle-Datenbank auf die gewünschte Versionierung bringen soll. Dazu werden SQL-Skripte aufgerufen, die teilweise mehrere DML- und DDL-Kommandos enthalten. Ein Skript gilt als eine Transaktion und es soll daher im Falle eines Fehlers ein Rollback erfolgen, wird das Skript aber erfolgreich ausgeführt, wird die DB-Versionsnummer geupdatet, es sei denn, das Tool läuft im Validationsmodus, dann erfolgt auch bei Erfolg ein Rollback.

Ich verwende JDBC und setzte AutoCommit auf false. Leider hat Oracle die blöde Eigenschaft, dass alle DDL-Statements automatisch commited werden, unabhängig vom AutoCommit-flag. Daher möchte ich gerne SavePoints setzen. Wenn ich es richtig verstehe, wird die DB im Falle eines rollback(savepoint) auf genau diesen Zustand zurückgesetzt, also auch alle DDL-Statements, oder?

Genau dies tue ich in den beiden folgenden Methode. Bevor ich ein Skript ausführe, setze ich einen Savepoint, denn ich dann im Falle eines rollbacks mit übergebe. Allerdings erhalte ich jedesmal die Fehlermeldung

"ORA-01086: Savepoint 'ORACLE_SVPT_3' wurde nicht festgelegt".

Hat irgendmand eine Idee, woran das liegen könnte? Übersehe ich einen dummen Fehler im Code?

Tausend Dank...

-------------------------

public boolean executeSQLScript (File script)

{

Savepoint save = setSavepoint();

boolean success = save == null? false : true;

boolean executed = false;

for (String sqlCommand : sqlCommands)

{

if (success)

{

if (!sqlCommand.contains("DBVERSION"))

{

success = executeSQL(sqlCommand);

executed = true;

}

}

}

if (success)

{

if (app.isValidate())

{

success = executed ? rollbackTransaction(save) : success;

}

else

{

success = updateDBVersion(newVersion);

}

}

else

{

if (app.isValidate())

{

MigrationToolApplication.LOGGER.output("Validation of script " + script.getName() + " couldn't be finished. Some errors occured.");

}

else

{

MigrationToolApplication.LOGGER.output("Execution of script " + script.getName() + " incorrect. Some errors occured.");

}

MigrationToolApplication.LOGGER.output("Rolling back transactions...");

rollbackTransaction(save);

}

return success;

}

private Savepoint setSavepoint()

{

try

{

MigrationToolApplication.LOGGER.output("Setting savepoint of data base for commit/rollback.");

return connect.setSavepoint();

}

catch (SQLException e)

{

MigrationToolApplication.LOGGER.output("Error during savepoint setting.");

MigrationToolApplication.LOGGER.output(e.getMessage());

return null;

}

}

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...