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

¿Cuál es el efecto de colocar la confirmación después de DML en el procedimiento?

¿Cuál es el efecto de colocar la confirmación de esta manera en el programa?

La documentación de Oracle describe COMMIT como:

Propósito

Usa el COMMIT declaración para finalizar su transacción actual y hacer permanentes todos los cambios realizados en la transacción. Una transacción es una secuencia de sentencias SQL que Oracle Database trata como una sola unidad. Esta declaración también borra todos los puntos de guardado en la transacción y libera los bloqueos de la transacción.

Si tiene tres PROCEDURE y cada uno contiene un COMMIT entonces no puede ejecutar los tres, entonces, si ocurre una excepción en el último, ROLLBACK todos ellos ya que los cambios de los dos primeros ya serán COMMIT ted.

Como regla general, no usa COMMIT en un PROCEDURE o FUNCTION pero debería dejar que la persona que llama COMMIT la transacción para que puedan agrupar varias acciones juntas.

Hay, por supuesto, casos de uso en los que querrá violar esta regla, pero debe considerar cada caso por separado y tomarse el tiempo para comprender completamente su lógica comercial antes de romper esta regla para saber qué es COMMIT en cada caso.

¿Debo realizar esta transacción como AUTONOMOUS_TRANSACTION? ?

Un caso de uso es el registro:es posible que tenga un PROCEDURE que llama a otro PROCEDURE para registrar las acciones del usuario y, independientemente de si la acción inicial tiene éxito o falla, desea mantener un registro de la acción y asegurarse de que el registro sea COMMIT ted. En este caso, el PROCEDURE de registro debe ser una AUTONOMOUS_TRANSACTION y contener un COMMIT declaración y la declaración de llamada debe (probablemente) no tener ninguno.

Entonces, si el COMMIT de un PROCEDURE siempre se requiere y es independiente de si la persona que llama COMMIT s otros datos luego haga el PROCEDURE una AUTONOMOUS_TRANSACTION . Si el PROCEDURE Los correos electrónicos se pueden agrupar y luego ROLLBACK como grupo, entonces no desea que sean AUTONOMOUS_TRANSACTION s.