Αυτόνομη Συναλλαγή σε Oracle PL / SQL
⚡ Έξυπνη Σύνοψη
Δηλώσεις Ελέγχου Συναλλαγών σε Oracle Τα PL/SQL, δηλαδή τα COMMIT, ROLLBACK και SAVEPOINT, αποφασίζουν εάν οι εκκρεμείς αλλαγές DML αποθηκεύονται ή απορρίπτονται. Μια αυτόνομη συναλλαγή εκτελείται ως ανεξάρτητο υποπρόγραμμα που πραγματοποιεί commit ή roll back ξεχωριστά από την κύρια συναλλαγή.

Τι είναι οι δηλώσεις TCL στο PL/SQL;
Το TCL σημαίνει Δηλώσεις Ελέγχου Συναλλαγών. Αυτές οι δηλώσεις είτε αποθηκεύουν τις εκκρεμείς συναλλαγές είτε τις ακυρώνουν. Παίζουν ζωτικό ρόλο, επειδή εκτός εάν αποθηκευτεί μια συναλλαγή, οι αλλαγές που έγιναν μέσω δηλώσεις DML δεν θα αποθηκευτούν μόνιμα στη βάση δεδομένων. Παρακάτω παρατίθενται οι διαφορετικές δηλώσεις TCL στο PL / SQL.
| Δήλωση | Περιγραφή |
|---|---|
| ΔΙΑΠΡΑΤΤΩ | Αποθηκεύει όλες τις εκκρεμείς συναλλαγές. |
| ΕΠΑΝΑΦΟΡΑ | Απορρίπτει όλες τις εκκρεμείς συναλλαγές. |
| ΑΠΟΘΗΚΕΥΣΗ | Δημιουργεί ένα σημείο στη συναλλαγή μέχρι το οποίο μπορεί να γίνει επαναφορά αργότερα. |
| ΕΠΙΣΤΡΟΦΗ ΣΤΟ | Απορρίπτει όλες τις εκκρεμείς συναλλαγές μέχρι το καθορισμένο σημείο αποθήκευσης. |
Η συναλλαγή θα ολοκληρωθεί υπό τις ακόλουθες συνθήκες:
- Όταν εκδίδεται οποιαδήποτε από τις παραπάνω δηλώσεις (εκτός από την SAVEPOINT).
- Όταν εκδίδονται εντολές DDL (οι DDL είναι εντολές αυτόματης ολοκλήρωσης).
- Όταν εκδίδονται εντολές DCL (οι DCL είναι εντολές αυτόματης ολοκλήρωσης).
Χρήση SAVEPOINT και ROLLBACK TO
Ο παραπάνω πίνακας παρουσιάζει τις επιλογές SAVEPOINT (ΣΗΜΕΙΟ ΑΠΟΘΗΚΕΥΣΗΣ) και ROLLBACK TO (ΕΠΑΝΑΚΥΡΩΣΗ ΣΤΟ), και μαζί σας δίνουν μερικό έλεγχο σε μια συναλλαγή. Ένα SAVEPOINT (ΣΗΜΕΙΟ ΑΠΟΘΗΚΕΥΣΗΣ) σηματοδοτεί ένα καθορισμένο σημείο μέσα στην τρέχουσα συναλλαγή. Μια μεταγενέστερη ROLLBACK TO (ΕΠΑΝΑΚΥΡΩΣΗ ΣΤΟ) σε αυτό το σημείο αποθήκευσης αναιρεί κάθε αλλαγή που έγινε μετά από αυτήν, ενώ διατηρείτεping η εργασία που είχε γίνει πριν από αυτό άθικτη.
Αυτό είναι χρήσιμο όταν μια μεγάλη συναλλαγή εκτελεί αρκετές SQL βήματα και μόνο το τελευταίο βήμα αποτυγχάνει. Αντί να απορρίψετε ολόκληρη τη συναλλαγή, μπορείτε να επαναφέρετε στο τελευταίο καλό σημείο αποθήκευσης και να συνεχίσετε.
Σύνταξη:
SAVEPOINT <savepoint_name>; -- one or more DML statements ROLLBACK TO <savepoint_name>;
Βασικά σημεία που πρέπει να θυμάστε σχετικά με τα savepoints:
- Ένα SAVEPOINT υπάρχει μόνο μέσα στην τρέχουσα συναλλαγή. Μια COMMIT ή μια πλήρης ROLLBACK διαγράφει κάθε savepoint.
- Όταν κάνετε επαναφορά σε ένα σημείο αποθήκευσης, τυχόν σημεία αποθήκευσης που δημιουργήθηκαν μετά από αυτό διαγράφονται, αλλά το σημείο αποθήκευσης στο οποίο κάνετε επαναφορά διατηρείται.
- Η επιλογή ROLLBACK TO (ΕΠΑΝΑΚΥΡΩΣΗ ΣΕ) δεν τερματίζει τη συναλλαγή. Οι αλλαγές που έγιναν πριν από το σημείο αποθήκευσης παραμένουν σε εκκρεμότητα μέχρι να κάνετε COMMIT (ΥΠΟΧΡΕΩΣΗ) ή ROLLBACK (ΕΠΑΝΑΚΥΡΩΣΗ).
- Εάν επαναχρησιμοποιήσετε ένα όνομα σημείου αποθήκευσης, το νεότερο SAVEPOINT μετακινεί τον δείκτη στην μεταγενέστερη θέση.
Επειδή η επιλογή ROLLBACK TO αφήνει τη συναλλαγή ανοιχτή, εξακολουθείτε να αποφασίζετε στο τέλος εάν θα COMMIT (ΥΠΟΒΟΛΗ) τις υπόλοιπες αλλαγές ή θα τις απορρίψετε με πλήρη ROLLBACK (ΑΝΑΚΛΗΣΗ).
Τι είναι η Αυτόνομη Συναλλαγή
Στην PL/SQL, όλες οι τροποποιήσεις που γίνονται στα δεδομένα ονομάζονται συναλλαγή. Μια συναλλαγή θεωρείται ολοκληρωμένη όταν εφαρμόζεται σε αυτήν αποθήκευση ή απόρριψη. Εάν δεν δοθεί αποθήκευση ή απόρριψη, τότε η συναλλαγή δεν θεωρείται ολοκληρωμένη και οι τροποποιήσεις που γίνονται στα δεδομένα δεν θα γίνουν μόνιμες στον διακομιστή.
Από προεπιλογή, η PL/SQL αντιμετωπίζει όλες τις τροποποιήσεις κατά τη διάρκεια μιας συνεδρίας ως μία μόνο συναλλαγή και η αποθήκευση ή η απόρριψη αυτής της συναλλαγής επηρεάζει κάθε εκκρεμή αλλαγή στην συνεδρία. Μια αυτόνομη συναλλαγή παρέχει στον προγραμματιστή τη δυνατότητα να κάνει αλλαγές σε μια ξεχωριστή συναλλαγή και να αποθηκεύσει ή να απορρίψει τη συγκεκριμένη συναλλαγή χωρίς να επηρεάσει την κύρια συναλλαγή της συνεδρίας.
- Μια αυτόνομη συναλλαγή μπορεί να καθοριστεί σε επίπεδο υποπρογράμματος.
- Για να φτιάξετε οποιοδήποτε υποπρόγραμμα εργασία σε διαφορετική συναλλαγή, η λέξη-κλειδί PRAGMA AUTONOMOUS_TRANSACTION θα πρέπει να δοθεί στην δηλωτική ενότητα αυτού του μπλοκ.
- Δίνει εντολή στον μεταγλωττιστή να το αντιμετωπίσει αυτό ως ξεχωριστή συναλλαγή και η αποθήκευση ή η απόρριψη μέσα σε αυτό το μπλοκ δεν θα αντικατοπτρίζεται στην κύρια συναλλαγή.
- Η έκδοση COMMIT ή ROLLBACK είναι υποχρεωτική πριν από την έξοδο από αυτήν την αυτόνομη συναλλαγή και την επιστροφή στην κύρια συναλλαγή, επειδή ανά πάσα στιγμή μόνο μία συναλλαγή μπορεί να είναι ενεργή.
- Έτσι, μόλις ξεκινήσει μια αυτόνομη συναλλαγή, πρέπει να αποθηκευτεί και να ολοκληρωθεί πριν ο έλεγχος επιστρέψει στην κύρια συναλλαγή.
Σύνταξη:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <execution_part> [COMMIT|ROLLBACK] END; /
Στην παραπάνω σύνταξη, το μπλοκ έχει γίνει μια αυτόνομη συναλλαγή.
Παράδειγμα 1: Σε αυτό το παράδειγμα, θα κατανοήσουμε πώς λειτουργεί μια αυτόνομη συναλλαγή.
Το παρακάτω στιγμιότυπο οθόνης δείχνει αυτό το παράδειγμα αυτόνομης συναλλαγής και την έξοδό του στο Oracle.
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
Code Επεξήγηση:
- Code γραμμή 2: Δηλώνεται ο αριθμός l_salary ως NUMBER.
- Code γραμμή 3: Δήλωση της διαδικασίας nested_block.
- Code γραμμή 4: Μετατροπή της διαδικασίας nested_block σε AUTONOMOUS_TRANSACTION.
- Code γραμμή 7-9: Αύξηση του μισθού του υπαλλήλου με αριθμό 1002 κατά 15000.
- Code γραμμή 10: Διεκπεραίωση της αυτόνομης συναλλαγής.
- Code γραμμή 13-16: Εκτύπωση των στοιχείων μισθοδοσίας των υπαλλήλων 1001 και 1002 πριν από τις αλλαγές.
- Code γραμμή 17-19: Αύξηση του μισθού του υπαλλήλου με αριθμό 1001 κατά 5000.
- Code γραμμή 20: Κλήση της διαδικασίας nested_block.
- Code γραμμή 21: Απόρριψη της κύριας συναλλαγής.
- Code γραμμή 22-25: Εκτύπωση των στοιχείων μισθοδοσίας των υπαλλήλων 1001 και 1002 μετά τις αλλαγές.
Η αύξηση μισθού για τον υπάλληλο με αριθμό 1001 δεν αντικατοπτρίζεται επειδή η κύρια συναλλαγή έχει απορριφθεί. Η αύξηση μισθού για τον υπάλληλο με αριθμό 1002 αντικατοπτρίζεται επειδή αυτό το μπλοκ έχει γίνει ξεχωριστή συναλλαγή και έχει αποθηκευτεί στο τέλος.
Έτσι, ανεξάρτητα από την αποθήκευση ή την απόρριψη στην κύρια συναλλαγή, οι αλλαγές στην αυτόνομη συναλλαγή αποθηκεύονται χωρίς να επηρεάζεται η κύρια συναλλαγή.
Πότε να χρησιμοποιείτε αυτόνομες συναλλαγές
Οι αυτόνομες συναλλαγές είναι ισχυρές, επομένως βοηθάει να γνωρίζουμε πότε ταιριάζουν. Κρατήστε τες για εργασία που πρέπει να επιτύχει ή να αποτύχει ανεξάρτητα από την κύρια συναλλαγή, όχι για την βασική επιχειρηματική λογική. Συνήθεις περιπτώσεις χρήσης περιλαμβάνουν:
- Καταγραφή ελέγχου: Καταγράψτε ποιος άλλαξε τα ευαίσθητα δεδομένα, πότε και τις παλιές και νέες τιμές, ώστε το αρχείο καταγραφής να διατηρηθεί ακόμα και αν η κύρια συναλλαγή ανατραπεί.
- Καταγραφή σφαλμάτων: Γράψτε μια εγγραφή σφάλματος μέσα σε ένα εξαίρεση χειριστή και COMMIT, έτσι ώστε οι διαγνωστικές λεπτομέρειες να διατηρούνται ενώ η αποτυχημένη συναλλαγή απορρίπτεται.
- Μετρητές και στατιστικά στοιχεία: Προωθήστε έναν μετρητή χρήσης ή έναν αριθμό επισκέψεων που πρέπει να διατηρείται ανεξάρτητα από το αποτέλεσμα του καλούντος.
- COMMIT μέσα σε ένα trigger: Ένα trigger δεν μπορεί να εκδώσει COMMIT απευθείας. Μια αυτόνομη συναλλαγή είναι ο μόνος υποστηριζόμενος τρόπος για να το κάνετε αυτό.
Αποφύγετε τις αυτόνομες συναλλαγές για συνηθισμένες ενημερώσεις που θα πρέπει να έχουν την ίδια τύχη με την κύρια συναλλαγή. Η υπερβολική χρήση τους μπορεί να κρύψει δεδομένα πίσω από ανεξάρτητες δεσμεύσεις και να δυσκολέψει την αποσφαλμάτωση. Κατά κανόνα, κάθε αυτόνομο μπλοκ πρέπει να τελειώνει με μια ρητή COMMIT ή ROLLBACK.
Αυτόνομες έναντι τακτικών συναλλαγών
Η διαφορά μεταξύ μιας κανονικής (κύριας) συναλλαγής και μιας αυτόνομης συναλλαγής καταλήγει στο εύρος και την ανεξαρτησία. Ο παρακάτω πίνακας τις συγκρίνει.
| Άποψη | Τακτική συναλλαγή | Αυτόνομη Συναλλαγή |
|---|---|---|
| Scope | Μοιράζεται μία συναλλαγή περιόδου σύνδεσης | Εκτελείται ως ξεχωριστή θυγατρική συναλλαγή |
| Εφέ COMMIT / ROLLBACK | Επηρεάζει όλες τις εκκρεμείς αλλαγές στην περίοδο λειτουργίας | Επηρεάζει μόνο το αυτόνομο μπλοκ |
| Δήλωση | Προεπιλεγμένη συμπεριφορά | PRAGMA AUTONOMOUS_TRANSACTION στην δηλωτική ενότητα |
| Επίδραση της επαναφοράς γονικού στοιχείου | Οι αλλαγές χάνονται | Οι δεσμευμένες αυτόνομες αλλαγές διατηρούνται |
| Τυπική χρήση | Βασική επιχειρηματική λογική | Έλεγχος και καταγραφή σφαλμάτων |
Σε αντίθεση με ένα κανονικό ένθετο μπλοκ, του οποίου οι αλλαγές μοιράζονται πάντα το αποτέλεσμα της περικλείουσας συναλλαγής, ένα αυτόνομο μπλοκ στέκεται από μόνο του. Η κατανόηση αυτής της διαφοράς σάς βοηθά να αποφασίσετε πότε ένα μπλοκ πρέπει να είναι ανεξάρτητο και πότε πρέπει να μοιράζεται το αποτέλεσμα της κύριας συναλλαγής.

