Αυτόνομη Συναλλαγή σε Oracle PL / SQL

⚡ Έξυπνη Σύνοψη

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

  • 💾 ΔΙΑΠΡΑΤΤΩ: Ορίζει όλες τις εκκρεμείς αλλαγές DML, τερματίζει τη συναλλαγή, καταργεί τα κλειδώματα και διαγράφει κάθε σημείο αποθήκευσης.
  • ↩️ ΑΝΑΚΥΡΩΣΗ: Αναιρεί τις εκκρεμείς αλλαγές, είτε ολόκληρη τη συναλλαγή είτε πίσω σε ένα καθορισμένο σημείο αποθήκευσης.
  • 📌 ΣΗΜΕΙΟ ΑΠΟΘΗΚΕΥΣΗΣ: Σημειώνει ένα σημείο μέσα σε μια συναλλαγή, έτσι ώστε μια μεταγενέστερη ROLLBACK TO να μπορεί να αναιρέσει μόνο ένα μέρος της εργασίας.
  • 🔀 Αυτόνομη Συναλλαγή: Η οδηγία PRAGMA AUTONOMOUS_TRANSACTION επιτρέπει σε ένα υποπρόγραμμα να ολοκληρώσει ή να επαναφέρει την εντολή από μόνο του.
  • 🧾 Χρήση περιπτώσεων: Οι αυτόνομες συναλλαγές είναι κατάλληλες για έλεγχο και καταγραφή σφαλμάτων, κάτι που πρέπει να διατηρείται ακόμη και αν η κύρια εργασία ανατραπεί.
  • 🤖 Βοήθεια AI: Οι βοηθοί τεχνητής νοημοσύνης, όπως το GitHub Copilot, σχεδιάζουν μπλοκ COMMIT, ROLLBACK και PRAGMA και επισημαίνουν ελλείπουσες υποβολές.

Αυτόνομη Συναλλαγή σε Oracle PL/SQL με COMMIT και ROLLBACK

Τι είναι οι δηλώσεις 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.

Παράδειγμα αυτόνομης συναλλαγής που υποβάλλει ένα ένθετο μπλοκ ενώ η κύρια συναλλαγή επιστρέφει Oracle PL / SQL

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 στην δηλωτική ενότητα
Επίδραση της επαναφοράς γονικού στοιχείου Οι αλλαγές χάνονται Οι δεσμευμένες αυτόνομες αλλαγές διατηρούνται
Τυπική χρήση Βασική επιχειρηματική λογική Έλεγχος και καταγραφή σφαλμάτων

Σε αντίθεση με ένα κανονικό ένθετο μπλοκ, του οποίου οι αλλαγές μοιράζονται πάντα το αποτέλεσμα της περικλείουσας συναλλαγής, ένα αυτόνομο μπλοκ στέκεται από μόνο του. Η κατανόηση αυτής της διαφοράς σάς βοηθά να αποφασίσετε πότε ένα μπλοκ πρέπει να είναι ανεξάρτητο και πότε πρέπει να μοιράζεται το αποτέλεσμα της κύριας συναλλαγής.

Συχνές Ερωτήσεις

Oracle εγείρει το ORA-06519 και ακυρώνει την αυτόνομη εργασία. Κάθε αυτόνομη συναλλαγή πρέπει να ολοκληρωθεί με μια ρητή COMMIT ή ROLLBACK πριν επιστρέψει ο έλεγχος στην κύρια συναλλαγή, επειδή επιτρέπεται μόνο μία ενεργή συναλλαγή κάθε φορά.

Όχι άμεσα. Ένα κανονικό trigger δεν μπορεί να εκδώσει COMMIT ή ROLLBACK. Η δήλωση του trigger ή μιας διαδικασίας που καλεί, με το PRAGMA AUTONOMOUS_TRANSACTION του επιτρέπει να ολοκληρώσει τις δικές του αλλαγές ανεξάρτητα από την εντολή που ενεργοποίησε το trigger.

Όχι. Μόλις ανασταλεί ο γονικός κώδικας, η αυτόνομη συναλλαγή εκτελείται ανεξάρτητα και δεν μπορεί να δει τις μη δεσμευμένες αλλαγές του γονικού κώδικα. Βλέπει μόνο δεδομένα που έχουν ήδη δεσμευτεί στη βάση δεδομένων, επομένως η αναμονή για ένα κλείδωμα γονικού κώδικα μπορεί να προκαλέσει αδιέξοδο.

Ναι. Κάθε εντολή DDL, όπως οι CREATE, ALTER ή DROP, εκδίδει μια έμμεση εντολή COMMIT πριν και μετά την εκτέλεσή της. Οποιαδήποτε εκκρεμής εντολή DML στην περίοδο λειτουργίας δεσμεύεται αυτόματα, επομένως μια εντολή DDL δεν μπορεί να ανακληθεί αργότερα.

Ένα αυτόνομο μπλοκ μπορεί να καλέσει ένα άλλο και το καθένα διαχειρίζεται τη δική του COMMIT ή ROLLBACK. Oracle περιορίζει τον αριθμό των συναλλαγών που είναι ενεργές ταυτόχρονα μέσω της παραμέτρου αρχικοποίησης TRANSACTIONS, επομένως η πολύ βαθιά ένθεση αυτόνομων μπλοκ μπορεί να αποτύχει.

Όχι. Μια εντολή COMMIT καθιστά τις αλλαγές μόνιμες, καταργεί τα κλειδώματα και διαγράφει σημεία αποθήκευσης, επομένως δεν μπορεί να αναιρεθεί με ROLLBACK. Για να αντιστρέψετε τα δεσμευμένα δεδομένα, πρέπει να εκτελέσετε νέα DML. Χρησιμοποιήστε την εντολή SAVEPOINT και την εντολή ROLLBACK TO για μερική αναίρεση πριν από την ολοκλήρωση.

Ναί. GitHub Copilot σχεδιάζει τη λογική COMMIT και ROLLBACK, τα μπλοκ SAVEPOINT και τις διαδικασίες PRAGMA AUTONOMOUS_TRANSACTION από ένα σχόλιο. RevΕλέγξτε την τοποθέτηση της υποβολής και τον χειρισμό σφαλμάτων, καθώς μια λανθασμένη τοποθέτηση της υποβολής μπορεί να καταστρέψει τα όρια των συναλλαγών.

Οι βοηθοί τεχνητής νοημοσύνης σαρώνουν διαδικασίες για εντολές COMMIT και ROLLBACK που λείπουν ή έχουν τοποθετηθεί σε λάθος θέση, για υποβολές εντός βρόχων και για μη κλειστά αυτόνομα μπλοκ. Αυτή η ανασκόπηση μηχανικής μάθησης επισημαίνει σφάλματα συναλλαγών και προτείνει ασφαλέστερα όρια πριν ο κώδικας φτάσει στην παραγωγή.

Συνοψίστε αυτήν την ανάρτηση με: