Συναλλαγές Βάσεων Δεδομένων (SQL Server)

Περίληψη

Μια συναλλαγή είναι μια ομάδα από SQL εντολές που εκτελούνται μαζί ως ενιαίο τμήμα των εργασιών που πρέπει να υλοποιηθούν. Αν όλες αυτές οι εντολές εκτελεστούν με επιτυχία, τότε η πράξη έχει γίνει commit, δηλαδή οι αλλαγές που γίνονται στα δεδομένα είναι οριστικές. Εάν οποιαδήποτε από τις εντολές μέσα σε συναλλαγή αποτύχει, τότε ολόκληρη η συναλλαγή ακυρώνεται: συγκεκριμένα στην SQL, η συναλλαγή θα πρέπει να αναιρεθεί όλη.
Εφαρμογές δυο επιπέδων, όπου το μεγαλύτερο μέρος της επιχειρηματικής λογικής είναι επικεντρωμένο σε κώδικα βάσεων δεδομένων, κάνουν έντονη χρήση των συναλλαγών. Ακόμη και σε πολυεπίπεδες εφαρμογές μπορούν να ωφεληθούν σε μεγάλο βαθμό με τη χρησιμοποίηση των συναλλαγών - κώδικας βάσεων δεδομένων μπορεί να γίνει μέρος μιας μεγαλύτερης συναλλαγής. Ακόμη και οι πολυεπίπεδες εφαρμογές πρέπει να χρησιμοποιούν τις συναλλαγές, δεδομένου ότι η βάση δεδομένων ερμηνεύει όλο το σύνολο των δραστηριοτήτων της σε μορφή συναλλαγών. Ωστόσο, η εφαρμογή ερμηνεύει συναλλαγές μόνο με insert, update και delete δηλώσεις. 
Ο τρόπος που γράφονται τις συναλλαγές επηρεάζει τις επιδόσεις του SQL Server σε μεγάλο βαθμό. Αυτό οφείλεται στον τρόπο υλοποίησης των συναλλαγών. Όταν γίνεται μια συναλλαγή, το κομμάτι των δεδομένων που πρόκειται να τροποποιηθεί είναι δεσμευμένο για αποκλειστική χρήση από το άτομο ή την επεξεργασία που ξεκίνησε τη συναλλαγή: στον SQL Server αυτή αναφέρεται ως κλείδωμα (locking). Δεδομένου ότι ο πίνακας και τα στοιχεία του ευρετηρίου είναι αποθηκευμένα σε "σελίδες", ο SQL Server μπορεί να κλειδώσει μια μοναδική γραμμή, σελίδα, ομάδα σελίδων ή ένα ολόκληρο πίνακα, ανάλογα με το ποσό των διαθέσιμων πόρων και των τροποποιήσεων των δεδομένων που πρέπει να γίνουν.

Κατηγορίες Συναλλαγών

Υπάρχουν δύο είδη συναλλαγών στον SQL Server οι έμμεσες (implicit) και άμεσες (explicit). Οι έμμεσες συναλλαγές διαχειρίζονται από τον SQL Server - για κάθε σχέση insert, update και delete, καθώς για όλα τα στοιχεία σχεσιακής γλώσσας (DDL) εκτελούνται ως έμμεσες (implicit) συναλλαγές. Αυτό σημαίνει ότι ακόμη και αν δεν βλέπουμε τις άμεσες (explicit) εντολές των συναλλαγών, ο SQL Server θα αναιρέσει το σύνολο της δήλωσης ή της ομάδας δηλώσεων αν αντιμετωπίσει ένα σφάλμα.
Οι άμεσες(explicit) συναλλαγές αποτελούνται από begin, commit και rollback συναλλαγές και συντάσσονται από τους προγραμματιστές.
Συνήθως, οι δηλώσεις που περικλείονται στο εσωτερικό μιας συναλλαγής θα πρέπει να περιλαμβάνουν το εντολών DML (π.χ. select, insert, update, merge - upsert, call - call a PL/SQL, explain plan, lock table) που πρέπει να εκτελεστούν ως μονάδα. Οι δηλώσεις select δεν τροποποιούν τα δεδομένα και γενικά δεν χρειάζεται να περιληφθούν σε μια συναλλαγή από τις ίδιες.

Ιδιότητες Συναλλαγών

Κάθε συναλλαγή σε SQL Server θα πρέπει να περάσει το τεστ ACID για να είναι έγκυρη. Οι ιδιότητες ACID μιας συναλλαγής είναι:

Α - Ατομικότητα (Atomicity)

Αυτό σημαίνει ότι ο SQL Server απαιτεί συναλλαγές που είτε όλες οι πράξεις της συναλλαγής
επιτυγχάνουν, είτε όλες αποτυγχάνουν.

C - Συνέπεια (Consistency)

Στο τέλος μιας συναλλαγής, η βάση του SQL Server πρέπει να είναι σε συνεπή μορφή.

I - Απομόνωση (Isolated)

Ακόμα κι αν τρέχουν πολλές συναλλαγές ταυτόχρονα, κάθε συναλλαγή πρέπει να νομίζει ότι τρέχει μόνη της.

D - Μονιμότητα (Durable)

Αν η συναλλαγή επιτύχει, πρέπει το αποτέλεσμά της να επιβιώνει, ακόμα και σε περίπτωση αποτυχίας του
συστήματος.
Ο SQL Server πραγματοποιεί συναλλαγές σταθερά μέσω της διαδικασίας ανάκτησης. Κάθε φορά που ο διακομιστής ξεκινά κάθε σύστημα και κάθε χρήστη η βάση δεδομένων κάνει ανάκτηση. Κατά τη διάρκεια της διαδικασίας ανάκαμψης όλες οι δεσμευμένες συναλλαγές πραγματοποιούνται μόνιμα - γράφονται στο δίσκο, σε περίπτωση που παραμείνουν στο αρχείο καταγραφής συναλλαγών (log) κατά την αποτυχία του συστήματος. Το σύνολο των μη επιβεβαιωμένων συναλλαγών αναιρούνται.

Αποτυχής Κατάσταση (Failed State)

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

Ματαιωμένη Κατάσταση (Aborted State)

Μια συναλλαγή βάσης δεδομένων, εφόσον το DBMS την έχει καθορίσει αποτυχημένη, μπαίνει στη Ματαιωμένη Φάση. Μια ματαιωμένη συναλλαγή δεν πρέπει να έχει συνέπειες για τη βάση δεδομένων, επομένως τυχόν αλλαγές που έχουν γίνει στη βάση δεδομένων πρέπει να αναιρεθούν, είτε σε τεχνικούς όρους κάνει roll back. Η βάση δεδομένων θα επιστρέψει στη συνεπή μορφή της όταν η ανεπιτυχής συναλλαγή έχει αναιρεθεί. Το DBMS είναι υπεύθυνο για τη διαχείριση της ματαίωσης των συναλλαγών (abort).

Επιβεβαιωμένη Κατάσταση(Committed State)

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

Σύνταξη Συναλλαγών

Όλες οι άμεσες (explicit) συναλλαγές αρχίζουν με τη δήλωση begin transaction. Δεν χρειάζεται να καθοριστεί το όνομα της συναλλαγής, αν και βοηθά να γίνει ο κώδικας πιο ευανάγνωστος, ειδικά αν χρησιμοποιούνται πολλαπλές συναλλαγές στο εσωτερικό των διαδικασιών. Τα ονόματα συναλλαγών μπορούν να είναι έως 32 χαρακτήρες.
Η επιλογή επιτρέπει να σηματοδοτήσει την συναλλαγή κατά το σύστημα καταγραφής συναλλαγών (transaction log). Αυτό είναι χρήσιμο για να επαναφερθεί μια συγκεκριμένη συναλλαγή μέσω του αρχείου συναλλαγών. Η επιλογή αυτή είναι επίσης δυνατή για την πρώτη συναλλαγή μέσα σε μια εκτέλεση. Εάν υπάρχουν πολλαπλές δηλώσεις begin tran μόνο η πρώτη μπορεί να σημειωθεί στο αρχείο καταγραφής συναλλαγών.
Αν όλα πάνε καλά με τη συναλλαγή και δεν εμφανίζονται σφάλματα, στη συνέχεια, μπορεί να χρησιμοποιηθεί η commit tran δήλωση για να γίνουν τις αλλαγές μόνιμες. Σε περίπτωση σφάλματος όλες οι εργασίες πρέπει να αναιρεθούν, το οποίο επιτυγχάνεται με τη δήλωση rollback tran. Η δήλωση rollback δέχεται το όνομα της συναλλαγής ως παράμετρο. Ωστόσο, επαναφέρει όλες τις ανοικτές συναλλαγές σχετικά με την τρέχουσα σύνδεση και όχι μόνο την επονομαζόμενη συναλλαγή.
Η σύνταξη επαναφοράς (ROLLBACK) περιλαμβάνει αποθηκευμένες καταστάσεις (savepoints). Οι αποθηκευμένες καταστάσεις είναι ένας τρόπος για να επισημανθεί ένα τμήμα του έργου, που θα αξίζει την εξοικονόμηση χώρου ακόμη και αν ορισμένα σφάλματα προκύψουν στο εσωτερικό της ίδιας συναλλαγής.
Για να αποθηκευτεί μια συναλλαγή σε ένα savepoint χρησιμοποιείται SAVE TRAN δήλωση. 
Ο SQL Server παρέχει επίσης commit work και rollback work σύνταξη. Οι δηλώσεις αυτές λειτουργούν όμοια με τις διαδικασίες συναλλαγές με λέξεις κλειδιά (keyword transaction). Η μόνη διαφορά είναι ότι δεν μπορούν να προμηθεύσουν τα ονόματα συναλλαγών με commit work και rollback work. Η λέξη κλειδί work είναι προαιρετική και στις δύο δηλώσεις.