Transaction autonome dans Oracle PL/SQL : validation, restauration
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 dรฉclarations TCL.
| COMMETTRE | Enregistre toutes les transactions en attente |
| RETOUR EN ARRIERE | Supprimer toutes les transactions en attente |
| POINT DE SAUVEGARDE | Crรฉe un point dans la transaction jusqu'ร lequel la restauration peut รชtre effectuรฉe plus tard |
| RETOUR ร | Supprimez toutes les transactions en attente jusqu'ร l'heure spรฉcifiรฉe |
La transaction sera complรฉtรฉ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 relevรฉs DCL sont รฉmis. (DCL sont des instructions de validation automatique)
Qu'est-ce que la transaction autonome
En PL/SQL, toutes les modifications apportรฉes aux donnรฉes seront qualifiรฉes de transaction. Une transaction est considรฉrรฉe comme terminรฉe lorsque la sauvegarde/rejet lui est appliquรฉe. Si aucune sauvegarde/rejet n'est effectuรฉe, alors la transaction ne sera pas considรฉrรฉe comme terminรฉe et les modifications apportรฉes aux donnรฉes ne seront pas rendues permanentes sur le serveur.
Indรฉpendamment de certaines modifications apportรฉes au cours d'une sรฉance, PL / SQL traitera l'ensemble de la modification comme une seule transaction et enregistrera/abandonnera 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 faire fonctionner n'importe quel sous-programme dans une transaction diffรฉrente, le mot-clรฉ 'PRAGMA AUTONOMOUS_TRANSATION' doit รชtre donnรฉ dans la section dรฉclarative de ce bloc.
- Il demandera au compilateur de traiter cela comme une transaction distincte et la sauvegarde/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 passer de cette transaction autonome ร la transaction principale car ร tout moment une seule transaction peut รชtre active.
- Ainsi, une fois que nous avons effectuรฉ une transaction autonome, nous devons la sauvegarder et terminer la transaction. Nous pouvons alors revenir ร la transaction principale.
syntaxe:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <executin_part> [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.
DECLARE
l_salary NUMBER;
PROCEDURE nested_block IS
PRAGMA autonomous_transaction;
BEGIN
UPDATE emp
SET salary = salary + 15000
WHERE emp_no = 1002;
COMMIT;
END;
BEGIN
SELECT 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 emp
SET salary = salary + 5000
WHERE 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;
Sortie
Before:Salary of 1001 is 15000 Before:Salary of 1002 is 10000 After:Salary of 1001 is 15000 After: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 de 1002 15000 du salaire de l'employรฉ numรฉro .
- Ligne de code 10 : Validation de la transaction.
- Ligne de code 13 ร 16 : Impression des dรฉtails du salaire des employรฉs 1001 et 1002 avant modifications.
- Ligne de code 17 ร 19 : Augmentation de 1001 5000 du salaire de l'employรฉ numรฉro .
- Ligne de code 20 : Appel de la procรฉdure nested_block ;
- Ligne de code 21 : Abandonner la transaction principale.
- Ligne de code 22 ร 25 : Impression des dรฉtails du salaire des employรฉs 1001 et 1002 aprรจs modifications.
- L'augmentation de salaire de 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 blocage a รฉtรฉ effectuรฉ en tant que transaction distincte et enregistrรฉ ร la fin.
- Ainsi, quelle que soit la sauvegarde/l'abandon lors de la transaction principale, les modifications apportรฉes ร la transaction autonome ont รฉtรฉ enregistrรฉes sans affecter les modifications principales de la transaction.

