Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie verwende ich Hibernate Session.doWork(...) für Sicherungspunkte / verschachtelte Transaktionen?

Die anfängliche java.sql.SQLException: IJ031040 scheint mit einem bestimmten Ergebnis während unseres Imports in Zusammenhang zu stehen. Sie wurde später durch eine andere java.sql.SQLException ersetzt die das Rollback für verwaltete Transaktionen verbieten. Aber ich konnte das Problem endlich lösen, indem ich native SQL-Anweisungen ausgab:

// Mark the current state as SAVEPOINT...
Session session = this.em.unwrap(Session.class);
session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        connection.prepareStatement("SAVEPOINT TRY_POSSIBILITY").executeUpdate();
    }
});

// 
// Do all the risky changes... verify... decide...
// 

// Rollback to SAVEPOINT if necessary!
session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        connection.prepareStatement("ROLLBACK TO SAVEPOINT TRY_POSSIBILITY").executeUpdate();
    }
});

Dies ermöglicht eine "verschachtelte Transaktion" innerhalb der größeren und hat meine Probleme gelöst.