Συναλλαγές (βάσεις δεδομένων)
Με τον όρο Βάση Δεδομένων εννοείται μία συλλογή από συστηματικά οργανωμένα (formatted) σχετιζόμενα δεδομένα. Συνήθως μια συλλογή από διάφορες λειτουργίες της βάσης δεδομένων, μοιάζει να είναι μια μονάδα από την πλευρά του χρήστη. Αυτό συμβαίνει γιατί όταν ένας χρήστης πραγματοποιεί μια μεταφορά χρημάτων για παράδειγμα, ουσιαστικά για εκείνον είναι μια λειτουργία, αλλά στη βάση δεδομένων πραγματοποιείται μια ακολουθία πράξεων μέχρις ότου καταλήξει στην επιθυμητή κατάσταση.
Το σύνολο των λειτουργιών, που αποτελούν μία μόνο λειτουργική μονάδα, ονομάζονται συναλλαγές. Μια ΒΔ πρέπει να εξασφαλίζει τη σωστή εκτέλεση των συναλλαγών, ανεξάρτητα από τυχών προβλήματα που μπορεί να παρουσιαστούν κατά την εκτέλεση, δηλαδή να εκτελείτε είτε ολόκληρη η Συναλλαγή είτε καθόλου. Παρακάτω, αναλύονται οι ορισμοί και οι βασικές έννοιες της επεξεργασίας των συναλλαγών καθώς και οι κύριες ιδιότητές τους.
Ορισμός
[Επεξεργασία | επεξεργασία κώδικα]Συναλλαγή είναι μια κινητή μονάδα εκτέλεσης ενός προγράμματος που προσπελαύνει και πιθανόν ενημερώνει διάφορα δεδομένα. Συνήθως, μια συναλλαγή ξεκινά από ένα πρόγραμμα χρήστη, που είναι γραμμένο σε μια γλώσσα υψηλού επιπέδου ή γλώσσα προγραμματισμού (για παράδειγμα, SQL, COBOL, C, C++, ή Java), όπου χωρίζεται από εντολές (ή κλήσεις συναρτήσεων) της μορφής begin transaction (έναρξη συναλλαγής) και end transaction (λήξη συναλλαγής). Η συναλλαγή αποτελείται από όλες τις λειτουργίες που εκτελούνται μεταξύ των begin transaction και end transaction[1].
Ιδιότητες
[Επεξεργασία | επεξεργασία κώδικα]Για να διασφαλιστεί η ακεραιότητα των δεδομένων, απαιτείται ή βάση δεδομένων να διατηρεί τις παρακάτω ιδιότητες συναλλαγών[2].
Ατομικότητα (Atomicity) |
Πρέπει να γίνουν όλες οι λεπτομέρειες της συναλλαγής σωστά στη βάση δεδομένων, ή καμία. |
Συνέπεια (Consistency) |
Η εκτέλεση μιας συναλλαγής απομονωμένα (δηλαδή, χωρίς ταυτόχρονη εκτέλεση άλλων συναλλαγών) διατηρεί την συνέπεια της βάσης δεδομένων. |
Απομόνωση (Isolation) |
Ακόμα και αν εκτελούνται ταυτόχρονα πολλές συναλλαγές το σύστημα εγγυάται ότι, για κάθε ζευγάρι από συναλλαγές Ti και Tj, Θα φαίνεται στην Ti ότι η Tj τελείωσε την εκτέλεση πριν ξεκινήσει η Ti ή ότι η Tj ξεκίνησε την εκτέλεση αφού τελείωσε η Ti. Έτσι, κάθε συναλλαγή δεν ξέρει για τις άλλες συναλλαγές που εκτελούνται ταυτόχρονα στο σύστημα. |
Ανοχή (Durability) |
Αφού μια συναλλαγή ολοκληρωθεί με επιτυχία, παραμένουν οι αλλαγές που έχει κάνει στη βάση δεδομένων, ακόμα και αν το σύστημα έχει πρόβλημα. |
Ιδιότητες |
Οι ιδιότητες αυτές συνήθως ονομάζονται ιδιότητες ACID. Το ακρωνύμιο παράγεται από το πρώτο γράμμα κάθε μιας από τις τέσσερις ιδιότητες στα αγγλικά.
Καταστάσεις Συναλλαγών
[Επεξεργασία | επεξεργασία κώδικα]Μια συναλλαγή είτε θα τερματιστεί κανονικά (commited) επιφέροντας μόνιμες αλλαγές στη ΒΔ είτε θα απορριφθεί (aborted) και τα δεδομένα θα επανέλθουν στην προηγούμενη κατάσταση[3]. Οι δυο αυτές καταστάσεις είναι οι μοναδικές καταστάσεις τερματισμού μιας συναλλαγής. Ωστόσο, πριν τον τερματισμό της μια συναλλαγή μπορεί να βρεθεί σε άλλη ενδιάμεση κατάσταση. Οι καταστάσεις στις οποίες μπορεί να υπεισέλθει μια συναλλαγή παρουσιάζονται στο σχήμα δεξιά και περιγράφονται στη συνέχεια.
- Ενεργή Κατάσταση (active). Η συναλλαγή εισέρχεται στην ενεργή κατάσταση κατά την αρχή της επεξεργασίας της και παραμένει σε αυτή εν’ όσω εκτελείται.
- Κατάσταση Μερικής Δέσμευσης (partially commited). Η συναλλαγή θεωρείται μερικώς ολοκληρωμένη όταν έχει ολοκληρωθεί και η τελευταία εντολή της συναλλαγής.
- Κατάσταση Αποτυχίας (failed). Η συναλλαγή αποτυγχάνει όταν το ΣΔΒΔ αντιληφθεί ότι δεν μπορεί να συνεχίσει η ομαλή επεξεργασία της.
- Κατάσταση Απόρριψης (aborted). Η συναλλαγή βρίσκεται στην κατάσταση αυτή όταν τα δεδομένα έχουν επανέλθει στην προηγούμενη σταθερή κατάσταση, πριν την αρχή της εκτέλεσης της συναλλαγής.
- Κατάσταση Δέσμευσης (commited). Η συναλλαγή έχει ολοκληρώσει την εκτέλεση της με επιτυχία.
Συναλλαγές στον SQL Server
[Επεξεργασία | επεξεργασία κώδικα]Υπάρχουν δύο είδη συναλλαγών στον SQL Server της Microsoft. οι έμμεσες (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 πραγματοποιεί συναλλαγές σταθερά μέσω της διαδικασίας ανάκτησης. Κάθε φορά που ο διακομιστής ξεκινά κάθε σύστημα και κάθε χρήστη η βάση δεδομένων κάνει ανάκτηση. Κατά τη διάρκεια της διαδικασίας ανάκαμψης όλες οι δεσμευμένες συναλλαγές πραγματοποιούνται μόνιμα - γράφονται στο δίσκο, σε περίπτωση που παραμείνουν στο αρχείο καταγραφής συναλλαγών (log) κατά την αποτυχία του συστήματος. Το σύνολο των μη επιβεβαιωμένων συναλλαγών αναιρούνται.
Σύνταξη Συναλλαγών
[Επεξεργασία | επεξεργασία κώδικα]Όλες οι άμεσες (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 είναι προαιρετική και στις δύο δηλώσεις.
Δείτε επίσης
[Επεξεργασία | επεξεργασία κώδικα]Παραπομπές
[Επεξεργασία | επεξεργασία κώδικα]- ↑ Συστήματα Βάσεων Δεδομένων - Η Πλήρης Θεωρία των Βάσεων Δεδομένων 4η Έκδοση Κεφ, Κεφ. 15.1 [Παρ. 1], Abraham Silberschatz, Henry F. Korth, S. Sudarshan.
- ↑ Συστήματα Βάσεων Δεδομένων - Η Πλήρης Θεωρία των Βάσεων Δεδομένων 4η Έκδοση, Κεφ. 15.1 [Παρ. 2], Abraham Silberschatz, Henry F. Korth, S. Sudarshan.
- ↑ Συστήματα Βάσεων Δεδομένων - Θεωρία & Πρακτική Εφαρμογή, Κεφ. 15.1.1, Ιωάννης Μανολόπουλος, Απόστολος Ν. Παπαδόπουλος
Εξωτερικοί Σύνδεσμοι
[Επεξεργασία | επεξεργασία κώδικα]- NTFS Transactions
- Unix Namesys Reiser4 File System
- ACID
- SQL Tutorial
- Introduction to Transactions
- https://web.archive.org/web/20100521003816/http://it.toolbox.com/wiki/index.php/Database_Transaction
- https://web.archive.org/web/20100524022131/http://www.4js.com/techdocs/genero/fgl/devel/DocRoot/User/Transactions.html