sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo usar Hibernate Session.doWork(...) para puntos de guardado/transacciones anidadas?

La java.sql.SQLException: IJ031040 parece estar relacionado con un resultado específico durante nuestra importación. Más tarde ha sido reemplazado por otro java.sql.SQLException que prohíben la reversión de las transacciones gestionadas. Pero finalmente pude resolver el problema emitiendo sentencias SQL nativas:

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

Esto permite una "Transacción anidada" dentro de la más grande y resolvió mis problemas.