Transaction autonome dans Oracle PL / SQL: validation, annulation

Table des matières:

Anonim

Que sont les instructions TCL en PL / SQL?

TCL signifie Transaction Control Statements. Il enregistrera les transactions en attente ou annulera la transaction en attente. Ces instructions jouent un rôle essentiel car à moins que la transaction ne soit enregistrée, les modifications via les instructions DML ne seront pas enregistrées dans la base de données. Vous trouverez ci-dessous les différentes instructions TCL.

S'ENGAGER Enregistre toutes les transactions en attente
RETOUR EN ARRIERE Supprimer toutes les transactions en attente
SAVEPOINT Crée un point dans la transaction jusqu'à ce que la restauration puisse être effectuée plus tard
ROLLBACK VERS Supprimer toutes les transactions en attente jusqu'au spécifié

La transaction sera terminée dans les scénarios suivants.

  • Lorsque l'une des déclarations ci-dessus est émise (sauf SAVEPOINT)
  • Lorsque les instructions DDL sont émises. (DDL sont des instructions de validation automatique)
  • QUAND les déclarations DCL sont émises. (DCL sont des instructions de validation automatique)

Qu'est-ce qu'une transaction autonome

En PL / SQL, toutes les modifications effectuées sur les données seront qualifiées de transaction. Une transaction est considérée comme terminée lorsque la sauvegarde / suppression lui est appliquée. Si aucune sauvegarde / suppression n'est donnée, alors la transaction ne sera pas considérée comme complète et les modifications apportées aux données ne seront pas rendues permanentes sur le serveur.

Indépendamment de certaines modifications effectuées au cours d'une session, PL / SQL traitera l'ensemble de la modification comme une seule transaction et l'enregistrement / la suppression de cette transaction affecte l'ensemble des modifications en attente dans cette session. La transaction autonome fournit une fonctionnalité au développeur dans laquelle elle permet d'effectuer des modifications dans une transaction distincte et de sauvegarder / supprimer cette transaction particulière sans affecter la transaction de session principale.

  • Cette transaction autonome peut être spécifiée au niveau du sous-programme.
  • Pour que n'importe quel sous-programme fonctionne dans une transaction différente, le mot-clé «PRAGMA AUTONOMOUS_TRANSATION» doit être indiqué dans la section déclarative de ce bloc.
  • Il demandera au compilateur de traiter cela comme une transaction séparée et l'enregistrement / la suppression à l'intérieur de ce bloc ne se reflétera pas dans la transaction principale.
  • L'émission de COMMIT ou ROLLBACK est obligatoire avant de sortir de cette transaction autonome vers la transaction principale car à tout moment une seule transaction peut être active.
  • Donc, une fois que nous avons effectué une transaction autonome, nous devons la sauvegarder et terminer la transaction, alors nous ne pouvons que revenir à la transaction principale.

Syntaxe:

DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
  • Dans la syntaxe ci-dessus, le bloc a été réalisé comme une transaction autonome.

Exemple 1 : Dans cet exemple, nous allons comprendre comment fonctionne la transaction autonome.

DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;dbms_output.put_line('Before Salary of 1001 is'|| l_salary);SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;dbms_output.put_line('Before Salary of 1002 is'|| l_salary);UPDATE empSET salary = salary + 5000WHERE emp_no = 1001;nested_block;ROLLBACK;SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;dbms_output.put_line('After Salary of 1001 is'|| l_salary);SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;dbms_output.put_line('After Salary of 1002 is '|| l_salary);end;

Production

Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000

Explication du code:

  • Ligne de code 2 : déclarer l_salary comme NUMBER.
  • Ligne de code 3 : déclaration de la procédure nested_block
  • Ligne de code 4 : Création de la procédure nested_block comme 'AUTONOMOUS_TRANSACTION'.
  • Ligne de code 7-9: Augmentation du salaire de l'employé numéro 1002 de 15000.
  • Ligne de code 10: validation de la transaction.
  • Ligne de code 13-16: Impression des détails de salaire de l'employé 1001 et 1002 avant les changements.
  • Ligne de code 17-19: Augmentation du salaire de l'employé numéro 1001 de 5000.
  • Ligne de code 20: Appel de la procédure nested_block;
  • Ligne de code 21: rejet de la transaction principale.
  • Ligne de code 22-25: Impression des détails de salaire de l'employé 1001 et 1002 après les changements.
  • L'augmentation de salaire pour l'employé numéro 1001 n'est pas reflétée car la transaction principale a été rejetée. L'augmentation de salaire pour l'employé numéro 1002 est reflétée car ce bloc a été effectué en tant que transaction distincte et sauvegardé à la fin.
  • Ainsi, indépendamment de la sauvegarde / suppression lors de la transaction principale, les modifications de la transaction autonome ont été enregistrées sans affecter les modifications de la transaction principale.