En primer lugar, BEGIN..END
son elementos meramente sintácticos, y no tienen nada que ver con las transacciones.
En segundo lugar, en Oracle todas las sentencias DML individuales son atómicas (es decir, tienen éxito completo o restituyen cualquier cambio intermedio en la primera falla) (a menos que use la opción EXCEPTIONS INTO, que no entraré aquí) .
Si desea un grupo de instrucciones a ser tratada como una única transacción atómica, usted haría algo como esto:
BEGIN
SAVEPOINT start_tran;
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO start_tran;
RAISE;
END;
De esta manera, cualquier excepción hará que las declaraciones en este bloque a laminar Atrás, pero las sentencias que se ejecutaron antes de este bloque no se revertirán.
Tenga en cuenta que no incluyo un COMPROMISO: generalmente prefiero el proceso de llamada para emitir el compromiso.
Es cierto que un bloque begin..end sin gestor de excepciones manejará automáticamente para el usuario:
BEGIN
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
END;
Si se produce una excepción, todas las inserciones y actualizaciones se revertirán ; pero tan pronto como quiera agregar un manejador de excepciones, no se revertirá. Por lo tanto, prefiero el método explícito de usar puntos de rescate.
Debe emitir instrucciones explícitas 'COMMIT' y' ROLLBACK' (quizás en una sección 'EXCEPTION') si ese es el comportamiento que está buscando. Si realmente desea una transacción atómica, busque AUTONOMOUS_TRANSACTIONS en Oracle. – Ollie