Αυτόνομη Συναλλαγή σε Oracle PL/SQL: Δέσμευση, επαναφορά

Τι είναι οι δηλώσεις TCL στο PL/SQL;

Το TCL σημαίνει δηλώσεις ελέγχου συναλλαγών. Είτε θα αποθηκεύσει τις εκκρεμείς συναλλαγές είτε θα επαναφέρει την εκκρεμή συναλλαγή. Αυτές οι εντολές παίζουν τον ζωτικό ρόλο γιατί, εκτός εάν η συναλλαγή αποθηκευτεί, οι αλλαγές μέσω των δηλώσεων DML δεν θα αποθηκευτούν στη βάση δεδομένων. Παρακάτω είναι οι διαφορετικές δηλώσεις TCL.

ΔΙΑΠΡΑΤΤΩ Αποθηκεύει όλες τις εκκρεμείς συναλλαγές
ΕΠΑΝΑΦΟΡΑ Απορρίψτε όλες τις εκκρεμείς συναλλαγές
ΑΠΟΘΗΚΕΥΣΗ Δημιουργεί ένα σημείο στη συναλλαγή μέχρι το οποίο μπορεί να γίνει επαναφορά αργότερα
ΕΠΙΣΤΡΟΦΗ ΣΤΟ Απορρίψτε όλες τις εκκρεμείς συναλλαγές μέχρι το καθορισμένο

Η συναλλαγή θα ολοκληρωθεί σύμφωνα με τα ακόλουθα σενάρια.

  • Όταν εκδίδεται οποιαδήποτε από τις παραπάνω καταστάσεις (εκτός SAVEPOINT)
  • Όταν εκδίδονται δηλώσεις DDL. (Το DDL είναι δηλώσεις αυτόματης δέσμευσης)
  • ΟΤΑΝ εκδίδονται δηλώσεις DCL. (Το DCL είναι δηλώσεις αυτόματης δέσμευσης)

Τι είναι η Αυτόνομη Συναλλαγή

Στο PL/SQL, όλες οι τροποποιήσεις που γίνονται στα δεδομένα θα χαρακτηρίζονται ως συναλλαγή. Μια συναλλαγή θεωρείται ολοκληρωμένη όταν εφαρμόζεται σε αυτήν η αποθήκευση/απόρριψη. Εάν δεν δοθεί αποθήκευση/απόρριψη, τότε η συναλλαγή δεν θα θεωρείται ολοκληρωμένη και οι τροποποιήσεις που έγιναν στα δεδομένα δεν θα γίνουν μόνιμες στον διακομιστή.

Ανεξάρτητα από ορισμένες τροποποιήσεις που έγιναν κατά τη διάρκεια μιας συνεδρίας, PL / SQL θα αντιμετωπίσει ολόκληρη την τροποποίηση ως μια μεμονωμένη συναλλαγή και η αποθήκευση/απόρριψη αυτής της συναλλαγής επηρεάζει το σύνολο των εκκρεμών αλλαγών σε αυτήν τη συνεδρία. Η Αυτόνομη Συναλλαγή παρέχει μια λειτουργικότητα στον προγραμματιστή στην οποία επιτρέπει την πραγματοποίηση αλλαγών σε μια ξεχωριστή συναλλαγή και την αποθήκευση/απόρριψη της συγκεκριμένης συναλλαγής χωρίς να επηρεάζεται η συναλλαγή της κύριας περιόδου λειτουργίας.

  • Αυτή η αυτόνομη συναλλαγή μπορεί να καθοριστεί σε επίπεδο υποπρογράμματος.
  • Για να λειτουργήσει οποιοδήποτε υποπρόγραμμα σε διαφορετική συναλλαγή, η λέξη-κλειδί "PRAGMA AUTONOMOUS_TRANSATION" θα πρέπει να δοθεί στην ενότητα δηλωτικών αυτού του μπλοκ.
  • Θα δώσει εντολή στον μεταγλωττιστή να το αντιμετωπίσει ως ξεχωριστή συναλλαγή και η αποθήκευση/απόρριψη μέσα σε αυτό το μπλοκ δεν θα αντικατοπτρίζεται στην κύρια συναλλαγή.
  • Η έκδοση COMMIT ή ROLLBACK είναι υποχρεωτική πριν βγείτε από αυτήν την αυτόνομη συναλλαγή στην κύρια συναλλαγή, επειδή ανά πάσα στιγμή μόνο μία συναλλαγή μπορεί να είναι ενεργή.
  • Αφού λοιπόν πραγματοποιήσουμε μια αυτόνομη συναλλαγή, πρέπει να την αποθηκεύσουμε και να ολοκληρώσουμε τη συναλλαγή, τότε μόνο μπορούμε να επιστρέψουμε στην κύρια συναλλαγή.

Σύνταξη:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • Στην παραπάνω σύνταξη, το μπλοκ έχει γίνει ως αυτόνομη συναλλαγή.

Παράδειγμα 1: Σε αυτό το παράδειγμα, θα κατανοήσουμε πώς λειτουργεί η αυτόνομη συναλλαγή.

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;

Παραγωγή

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

Αυτόνομη Συναλλαγή

Επεξήγηση κώδικα:

  • Κωδικός γραμμή 2: Δήλωση l_salary ως NUMBER.
  • Κωδικός γραμμή 3: Δήλωση διαδικασίας nested_block
  • Κωδικός γραμμή 4: Πραγματοποίηση της διαδικασίας nested_block ως "AUTONOMOUS_TRANSACTION".
  • Γραμμή κώδικα 7-9: Αύξηση του μισθού του υπαλλήλου με αριθμό 1002 κατά 15000.
  • Κωδικός γραμμή 10: Δέσμευση της συναλλαγής.
  • Γραμμή κώδικα 13-16: Εκτύπωση στοιχείων μισθοδοσίας υπαλλήλου 1001 και 1002 πριν τις αλλαγές.
  • Γραμμή κώδικα 17-19: Αύξηση του μισθού του υπαλλήλου με αριθμό 1001 κατά 5000.
  • Κωδικός γραμμή 20: Κλήση της διαδικασίας nested_block.
  • Κωδικός γραμμή 21: Απόρριψη της κύριας συναλλαγής.
  • Γραμμή κώδικα 22-25: Εκτύπωση στοιχείων μισθοδοσίας υπαλλήλου 1001 και 1002 μετά από αλλαγές.
  • Η αύξηση μισθού για τον αριθμό 1001 υπαλλήλου δεν αντικατοπτρίζεται επειδή η κύρια συναλλαγή έχει απορριφθεί. Η αύξηση μισθού για τον αριθμό υπαλλήλου 1002 αντικατοπτρίζεται επειδή αυτό το μπλοκ έχει γίνει ως ξεχωριστή συναλλαγή και έχει αποθηκευτεί στο τέλος.
  • Έτσι, ανεξάρτητα από την αποθήκευση/απόρριψη στην κύρια συναλλαγή, οι αλλαγές στην αυτόνομη συναλλαγή έχουν αποθηκευτεί χωρίς να επηρεάζονται οι αλλαγές της κύριας συναλλαγής.