Oracle
 sql >> Database >  >> RDS >> Oracle

Come utilizzare Hibernate Session.doWork(...) per punti di salvataggio/transazioni nidificate?

L'iniziale java.sql.SQLException: IJ031040 sembra correlato a un risultato specifico durante la nostra importazione. Successivamente è stato sostituito con un'altra java.sql.SQLException che vietano il rollback per le transazioni gestite. Ma potrei finalmente risolvere il problema emettendo istruzioni SQL native:

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

Ciò consente una "Transazione annidata" all'interno di quella più grande e risolve i miei problemi.