Una solucion podria ser usar procedimientos almacenados, donde haces todos los inserts, manejas los errores, y si no se ha dado error, tonces haces el commit, sino no.
te dejo un ejemplo de codigo que hice hace harto tiempo en pl sql
Código:
ERROR NUMBER;
AUX1 NUMBER;
AUX2 NUMBER;
AUX3 NUMBER;
AUX4 NUMBER;
BEGIN
AUX1 := FUN_SET_EEMT( V_VPRSN_CDG,V_PRCS_CDG_SEQ,V_EEMT_CDG,V_PRMM_CDG,V_EEMT_TXT,V_EEMT_PONDERACION,V_EEMT_CUMPLIMIENTO,V_EEMT_SWT_CONTINGENTE);
AUX2 := FUN_SET_TOTAL_META(V_VPRSN_CDG,V_PRCS_CDG_SEQ);
AUX3 := FUN_SET_TOTAL_EVALUACION(V_VPRSN_CDG,V_PRCS_CDG_SEQ);
AUX4 := FUN_SET_AVANCE_EEMT(V_VPRSN_CDG,V_PRCS_CDG_SEQ);
IF AUX1 <> -1 AND AUX2 <> -1 AND AUX3 <> -1 AND AUX4 <> -1 THEN
COMMIT;
ERROR :=AUX1;
ELSE
ROLLBACK;
ERROR := -1;
END IF;