Αυτόνομη Συναλλαγή σε 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 αντικατοπτρίζεται επειδή αυτό το μπλοκ έχει γίνει ως ξεχωριστή συναλλαγή και έχει αποθηκευτεί στο τέλος.
- Έτσι, ανεξάρτητα από την αποθήκευση/απόρριψη στην κύρια συναλλαγή, οι αλλαγές στην αυτόνομη συναλλαγή έχουν αποθηκευτεί χωρίς να επηρεάζονται οι αλλαγές της κύριας συναλλαγής.