Oracle
 sql >> Base de données >  >> RDS >> Oracle

Quel est l'effet de placer le commit après DML dans la procédure ?

Quel est l'effet de placer le commit comme celui-ci dans le programme ?

La documentation Oracle décrit COMMIT comme :

Objectif

Utilisez le COMMIT déclaration pour mettre fin à votre transaction en cours et rendre permanents tous les changements effectués dans la transaction. Une transaction est une séquence d'instructions SQL qu'Oracle Database traite comme une seule unité. Cette instruction efface également tous les points de sauvegarde de la transaction et libère les verrous de transaction.

Si vous avez trois PROCEDURE et chacun contient un COMMIT instruction alors vous ne pouvez pas exécuter les trois puis, si une exception se produit dans une dernière, ROLLBACK tous car les changements des deux premiers seront déjà COMMIT ted.

En règle générale, vous ne devez pas utilisez COMMIT dans une PROCEDURE ou FUNCTION mais devrait laisser à l'appelant le soin de COMMIT la transaction afin qu'ils puissent regrouper plusieurs actions ensemble.

Il existe, bien sûr, des cas d'utilisation où vous voudrez enfreindre cette règle, mais vous devez considérer chaque cas séparément et prendre le temps de bien comprendre votre logique métier avant d'enfreindre cette règle afin de savoir ce qu'est COMMIT ted dans chaque cas.

Dois-je effectuer cette transaction en tant que AUTONOMOUS_TRANSACTION ?

Un cas d'utilisation est la journalisation - vous pouvez avoir une PROCEDURE qui appelle une autre PROCEDURE pour enregistrer les actions de l'utilisateur et, que l'action initiale réussisse ou échoue, vous souhaitez conserver un journal de l'action et vous assurer que le journal est COMMIT ted. Dans ce cas, la journalisation PROCEDURE doit être un AUTONOMOUS_TRANSACTION et contiennent un COMMIT et l'instruction d'appel ne devrait (probablement) avoir ni l'un ni l'autre.

Donc, si le COMMIT d'une PROCEDURE est toujours requis et est indépendant du fait que l'appelant COMMIT s autres données puis faites la PROCEDURE une AUTONOMOUS_TRANSACTION . Si la PROCEDURE s peuvent être regroupés, puis ROLLBACK en tant que groupe, vous ne voulez pas les rendre AUTONOMOUS_TRANSACTION s.