Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser Hibernate Session.doWork(...) pour les points de sauvegarde/transactions imbriquées ?

L'exception java.sql.SQLException: IJ031040 initiale semble lié à un résultat spécifique lors de notre importation. Il a ensuite été remplacé par un autre java.sql.SQLException qui interdisent la restauration pour les transactions gérées. Mais j'ai finalement pu résoudre le problème en émettant des instructions SQL natives :

// 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();
    }
});

Cela permet une "transaction imbriquée" dans la plus grande et a résolu mes problèmes.