# Rollback mit Savepoint funktioniert auf Oracle nicht (ORA-01086)



## xerberuz (16. Aug 2011)

Folgender Code funktioniert wunderbar auf  Postgrsql und DB2. Bei Oracle bekomm ich aber eine ORA-01086 wenn ich versuche einen rollback auf den savepoint auszuführen. 

ORA-01086: savepoint 'ORACLE_SVPT_1' never established in this session or is invalid


```
final Savepoint statementSavepoint = this.connection.setSavepoint();
Statement statement = null;
try
{
    statement = this.connection.createStatement();
    statement.execute(sqlStatement.getSqlStatement());
}
catch (final Exception e)
{
    if (sqlStatement.isFailOnError())
    {
      throw e;
    }
    else
    {
      this.connection.rollback(statementSavepoint); //hier fliegt die exception
    }
}
```


----------



## Deros (16. Aug 2011)

dein Beispiel ist etwas merkwürdig...du machst nen savepoint, führst dann ein statement aus und wenn das schief geht willst du zu dem savepoint zurückspringen? was soll sich denn in der db geändert haben wenn das statement nicht ausgeführt werden konnte?


----------



## xerberuz (17. Aug 2011)

Vermutlich hat sich nichts geändert. Aber selbst dann müsste ich zum savepoint zurück können. Auf anderen Datenbanken funktioniert das ja auch. Die Oracle macht das laut Dokumentation sogar implizit. Also vor jedem INSERT, UPDATE und DELETE Statement einen Savepoint auf den zurückgerollt wird. D.h. ich müsste das auch machen können. Eventuell verursacht aber dieser automatische Rollback die invalidierung meines Savepoints.


----------



## DerEisteeTrinker (17. Aug 2011)

Warum so umständlich mit savepoint? AutoCommit aus geschalten vor dem Statement und dann musst das per Hand machen das commit und schon wird automatisch ein rollback von der Oracle gemacht, wenn das Commit nicht kommt, wenn die Verbindung getrennt wurde


----------



## xerberuz (17. Aug 2011)

DerEisteeTrinker hat gesagt.:


> Warum so umständlich mit savepoint? AutoCommit aus geschalten vor dem Statement und dann musst das per Hand machen das commit und schon wird automatisch ein rollback von der Oracle gemacht, wenn das Commit nicht kommt, wenn die Verbindung getrennt wurde



Auto commit ist aus. Ich hab fesgestellt worans liegt. Das fragliche Statement was ein CREATE statement. Danach ist der Savepoint nciht mehr zu gebrauchen. Bei INSERT, UPDATE und DELETE funktioniert es. 

Das ist so umständlich gemacht weil ich den commit erst nach ein paar Statements haben möchte und nicht nach jedem. Der rollback ist eher die Ausnahme weil es ein paar wenige Statements gibt bei denen mir die erfolgreiche Ausführung egal ist.  Bei allen anderen wird die ganze Transaktion zurückgerollt und nicht nur bis zum savepoint.


----------

