Βάσεις Δεδομένων Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα Στέργιος Παλαμάς, Υλικό Μαθήματος «Βάσεις Δεδομένων», 2015-2016
Κεφάλαιο 7: Transactions (Συναλλαγές)
Ο λόγος που αναπτύχθηκαν οι Βάσεις Δεδομένων και τα ΣΔΒΔ είναι η δυνατότητα των χρηστών να εκτελούν συναλλαγές με αυτά μέσω των εφαρμογών που έχουν αναπτυχθεί για αυτό το σκοπό. Έτσι για παράδειγμα ο πελάτης μιας Τράπεζας μπορεί να εκτελέσει μια πληρωμή λογαριασμού, ή μια μεταφορά χρηματικού ποσού χρησιμοποιώντας την αντίστοιχη εφαρμογή. Η εφαρμογή θα αλληλεπιδράσει με τη Β.Δ. για να γίνουν οι απαραίτητες τροποποιήσεις στα δεδομένα (π.χ. μείωση του ποσού του καταθέτη, πίστωση του αντίστοιχου ποσού στον δικαιούχο κλπ). Χρήστης Χρήστης Βάση Δεδομένων Συναλλαγή (Transaction) με μια Βάση Δεδομένων ονομάζουμε μια σειρά ενεργειών που εκτελούνται από κάποιον χρήστη ή κάποια εφαρμογή και έχουν ως στόχο την προσπέλαση της Β.Δ. ή την πραγματοποίηση τροποποιήσεων σε αυτή. Το σύνολο των ενεργειών που περιλαμβάνει μια συναλλαγή αποτελεί μια λογική μονάδα εργασίας. Ουσιαστικά η συναλλαγή (ή δοσοληψία) είναι μια λογική ομάδα εντολών SQL που πρέπει να εκτελεστούν ΟΛΕΣ επιτυχώς ή να μην εκτελεστεί καμία.
Χρήστης Χρήστης Βάση Δεδομένων Τα Σ.Δ.Β.Δ. έχουν φτιαχτεί ώστε να εξυπηρετούν πολλούς χρήστες ταυτόχρονα. Κάποιοι χρήστες είναι δυνατό να επιχειρούν την ταυτόχρονη προσπέλαση των ίδιων δεδομένων (π.χ. της ίδιας εγγραφής ενός πίνακα). Η ταυτόχρονη ανάγνωση ΔΕΝ αποτελεί πρόβλημα Η ταυτόχρονη τροποποίηση απαιτεί ειδικό χειρισμό από το ΣΔΒΔ. Ο χειρισμός του ΣΔΒΔ σε αυτές τις περιπτώσεις πρέπει να είναι αυτόματος χωρίς να απαιτεί παρέμβαση πχ του διαχειριστή ή του προγραμματιστή. Παράδειγμα: Δύο πελάτες ενός ξενοδοχείου προσπαθούν ταυτόχρονα να κάνουν κράτηση ενός δωματίου. Η δοσοληψία (transaction) πρέπει να αφήνει τη Β.Δ. σε έγκυρη κατάσταση, συνεπή προς την παλιά.
Καταστάσεις δοσοληψίας (transaction) Transaction Manager Δοσοληψία (transaction) Επιτυχής στο σύνολό της: Επικυρώνεται (COMMIT) Ανεπιτυχής: Ακυρώνεται (ROLLBACK) Στην περίπτωση που μια δοσοληψία ακυρώνεται (Rollback) η Β.Δ. πρέπει να επανέλθει ακριβώς στην κατάσταση που βρισκόταν πριν την απόπειρα εκτέλεσης της δοσοληψίας. Transaction Manager: Το τμήμα του ΣΔΒΔ που διαχειρίζεται της δοσοληψίες
Επισήμανση δοσοληψίας (transaction) Ένα ΣΔΒΔ δε μπορεί να αντιληφτεί αυτόματα αν μια ομάδα εντολών SQL που δέχεται αποτελούν μια δοσοληψία. Έτσι οι προγραμματιστές πρέπει να δηλώνουν την αρχή και το τέλος της δοσοληψίας. COMMIT BEGIN TRANSACTION SQL εντολή 1 SQL εντολή 2 SQL εντολή ν Ή ROLLBACK
Ιδιότητες που πρέπει να πληρούνται Ατομικότητα (atomicity): Κάθε συναλλαγή πρέπει να εκτελείται ως ενιαίο σύνολο. Όλες οι επιμέρους εντολές θα εκτελεστούν με επιτυχία ή δε θα εκτελεστεί καμία. Συνοχή (consistency): Κάθε συναλλαγή πρέπει να διασφαλίζει τη συνοχή της Β.Δ. Την παραλαμβάνει σε μια έγκυρη κατάσταση και πρέπει να την παραδίδει σε έγκυρη κατάσταση. Απομόνωση (isolation): Κάθε συναλλαγή πρέπει να εκτελείται ανεξάρτητα από τις άλλες. Αν εκτελούνται πολλές συναλλαγές ταυτόχρονα τα προσωρινά αποτελέσματα μιας δεν πρέπει να επηρεάζουν τις υπόλοιπες. Διατηρισιμότητα (Durability): Τα αποτελέσματα μιας επιτυχούς συναλλαγής πρέπει να είναι μόνιμα, να αποθηκευτούν και να μη χαθούν π.χ. σε περίπτωση κατάρρευσης του συστήματος. Οι παραπάνω αρχές είναι γνωστές και ως A.C.I.D. Από τα αρχικά των αγγλικών όρων
Παράδειγμα Συναλλαγής (1/2) Ο πελάτης μιας τράπεζας διατηρεί δύο λογαριασμούς Α (500 ) και Β (1000 ) και θέλει να μεταφέρει 100 από τον ένα λογαριασμό στον άλλο. BEGIN TRANSACTION Διάβασε Υπόλοιπο Α Αφαίρεσε 100 από το υπόλοιπο Α Αποθήκευσε νέο Υπόλοιπο Α Διάβασε Υπόλοιπο Β Πρόσθεσε στο Υπόλοιπο Β 100 Αποθήκευσε νέο Υπόλοιπο Β COMMIT ή ROLLBACK Οι παραπάνω ενέργειες αποτελούν μια συναλλαγή καθώς αποτυχία έστω και μιας από τις παραπάνω ενέργειες θα προκαλούσε αλλοίωση της πραγματικής εικόνας των λογαριασμών του πελάτη.
Παράδειγμα Συναλλαγής (2/2) Ατομικότητα (atomicity): Αν γινόταν η ανάληψη από τον λογαριασμό Α και δεν καταχωρούταν η πίστωση στο λογαριασμό Β ο πελάτης θα έχανε 100. Η έννοια της ατομικότητας προστάζει να εκτελεστούν ΟΛΕΣ οι ενέργειες ή καμία από αυτές. Συνοχή (consistency): Πριν τη συναλλαγή ο πελάτης είχε 1500 (500 + 1000). Μετά τη συναλλαγή πρέπει να έχει πάλι 1500 (400 + 1100 ). Η Β.Δ. δηλαδή να διατηρήσει τη συνοχή της. Απομόνωση (isolation): Έστω ότι παράλληλα με την παραπάνω συναλλαγή εκτελείται και μια παράλληλη συναλλαγή όπως η πληρωμή ενός λογαριασμού 200 από την κατάθεση Β. Η δύο συναλλαγές πρέπει να εκτελεστούν απρόσκοπτα χωρίς να παρεμβάλλεται η μία στην άλλη και στο τέλος ο λογαριασμός Α να έχει 400 (500-100) και ο λογαριασμός Β 900 (1000 + 100 200). Διατηρισιμότητα (Durability): Αν παρουσιαστεί μια βλάβη πχ στο σύστημα της τράπεζας και η συναλλαγή έχει μόλις ολοκληρωθεί, πρέπει μετά την αποκατάσταση του προβλήματος οι λογαριασμοί να έχουν τα νέα ποσά.
Παράδειγμα Συναλλαγής (2/2) Ατομικότητα (atomicity): Αν γινόταν η ανάληψη από τον λογαριασμό Α και δεν καταχωρούταν η πίστωση στο λογαριασμό Β ο πελάτης θα έχανε 100. Η έννοια της ατομικότητας προστάζει να εκτελεστούν ΟΛΕΣ οι ενέργειες ή καμία από αυτές. Συνοχή (consistency): Πριν τη συναλλαγή ο πελάτης είχε 1500 (500 + 1000). Μετά τη συναλλαγή πρέπει να έχει πάλι 1500 (400 + 1100 ). Η Β.Δ. δηλαδή να διατηρήσει τη συνοχή της. Απομόνωση (isolation): Έστω ότι παράλληλα με την παραπάνω συναλλαγή εκτελείται και μια παράλληλη συναλλαγή όπως η πληρωμή ενός λογαριασμού 200 από την κατάθεση Β. Η δύο συναλλαγές πρέπει να εκτελεστούν απρόσκοπτα χωρίς να παρεμβάλλεται η μία στην άλλη και στο τέλος ο λογαριασμός Α να έχει 400 (500-100) και ο λογαριασμός Β 900 (1000 + 100 200). Διατηρισιμότητα (Durability): Αν παρουσιαστεί μια βλάβη πχ στο σύστημα της τράπεζας και η συναλλαγή έχει μόλις ολοκληρωθεί, πρέπει μετά την αποκατάσταση του προβλήματος οι λογαριασμοί να έχουν τα νέα ποσά.
Ταυτόχρονη εκτέλεση συναλλαγών Σε ένα ΣΔΒΔ επιτρέπεται η ταυτόχρονη εκτέλεση πολλών συναλλαγών. Η ιδέα είναι το ανάλογο του πολύ-προγραμματισμού στα Λειτουργικά Συστήματα όπου πολλές διεργασίες εκτελούνται ταυτόχρονα. Η παράλληλη εκτέλεση συναλλαγών είναι επιθυμητή για διάφορους λόγους, όπως: Μια συναλλαγή αποτελείται από επι-μέρους ενέργειες. Έτσι μια εντολή μιας συναλλαγής μπορεί να απασχολεί το σκληρό δίσκο ενώ μια άλλη εντολή άλλης συναλλαγής τη CPU. Έτσι γίνεται καλύτερη εκμετάλλευση των πόρων του συστήματος. Μια συναλλαγή μπορεί να παίρνει πολύ χρόνο να εκτελεστεί ενώ ταυτόχρονα μπορούν να υπάρχουν άλλες πολύ σύντομες. Αν όλες οι συναλλαγές εκτελούταν σειριακά, οι σύντομες μπορεί να περίμεναν για πολλή ώρα μέχρι να τερματιστεί η πολύπλοκη. Με την παράλληλη εκτέλεση, η ολοκλήρωση της πολύπλοκης συναλλαγής θα αργήσει ακόμη περισσότερο αλλά παράλληλα θα εξυπηρετηθούν και οι σύντομης διάρκειας που διαφορετικά θα περίμεναν. Έτσι ο μέσος χρόνος αναμονής των συναλλαγών μικραίνει.
Προβλήματα από την ταυτόχρονη εκτέλεση συναλλαγών Η ταυτόχρονη εκτέλεση πολλών συναλλαγών απαιτεί έλεγχο διαφορετικά ανακύπτουν σοβαρά θέματα εγκυρότητας στη Β.Δ. Παράδειγμα 1: Σε μια τραπεζική Β.Δ. πρέπει να εκτελεστούν οι παρακάτω συναλλαγές για έναν πελάτη που διαθέτη λογαριασμό Α με 100.000 υπόλοιπο. Η σειριακή εκτέλεση των συναλλαγών θα είχε σαν αποτέλεσμα το νέο υπόλοιπο του λογαριασμού Α να είναι 150.000. Η παράλληλη εκτέλεση των συναλλαγών με μια μικρή χρονική διαφορά η μία από την άλλη και χωρίς κανέναν έλεγχο θα είχε σαν αποτέλεσμα την απώλεια ποσού από τον λογαριασμό, όπως φαίνεται παρακάτω: Το συγκεκριμένο πρόβλημα λέγεται χαμένη ενημέρωση (Lost update). Δεν πρέπει λοιπόν μια συναλλαγή να διαβάζει τιμές από μια περιοχή της Β.Δ. όταν μια άλλη συναλλαγή ΕΝΗΜΕΡΩΝΕΙ την ίδια περιοχή.
Προβλήματα από την ταυτόχρονη εκτέλεση συναλλαγών Παράδειγμα 2: Στην ίδια περίπτωση με το προηγούμενο παράδειγμα (λογαριασμός Α, 100.000 ) η παράλληλη εκτέλεση των δύο συναλλαγών μετατοπίζεται χρονικά ως εξής: Αν για κάποιο λόγο (π.χ. διακοπή της online σύνδεσης), η Συναλλαγή 2 δεν επικυρωθεί, τότε κανονικά θα έπρεπε να ισχύσουν μόνο όσα περιλαμβάνει η Συναλλαγή 1, και το υπόλοιπο να γίνει 50.000. Εδώ όμως η Συναλλαγή 1 έχει προλάβει να διαβάσει το ενδιάμεσο αποτέλεσμα της Συναλλαγής 2 ΠΡΙΝ αυτή γίνει ROLL BACK με αποτέλεσμα να προκύπτει λανθασμένο αποτέλεσμα. Το συγκεκριμένο πρόβλημα λέγεται ανεπικύρωτη εξάρτηση (uncommitted dependency). Δεν πρέπει λοιπόν μια συναλλαγή να έχει πρόσβαση στα ΕΝΔΙΑΜΕΣΑ αποτελέσματα άλλης συναλλαγής.
Προβλήματα από την ταυτόχρονη εκτέλεση συναλλαγών Παράδειγμα 3: Σε αυτό το παράδειγμα η Συναλλαγή Α μεταφέρει 50.000 από τον Α στο Β ενώ η Συναλλαγή 2 υπολογίζει το συνολικό ποσό των δύο καταθέσεων ΩΡΑ Συναλλαγή Α Συναλλαγή Β Υπόλοιπο Α Υπόλοιπο Β SUM 11:00 ΑΡΧΗ 100.000 50.000 11:01 ΑΡΧΗ SUM <- 0 100.000 50.000 0 11:02 Διάβασε Α Διάβασε Α 100.000 50.000 0 11:03 Α <- Α-50.000 SUM <- SUM + A 100.000 50.000 100.000 11:04 Αποθήκευσε Α 50.000 50.000 100.000 11:05 Διάβασε Β 50.000 50.000 100.000 11:06 Β <- Β + 50.000 50.000 50.000 100.000 11:07 Αποθήκευσε Β Διάβασε Β 50.000 100.000 100.000 11:08 ΤΕΛΟΣ (Commit) SUM <- SUM + B 50.000 100.000 100.000 ΤΕΛΟΣ (Commit) 200.000 Εδώ λόγω του χρονισμού η Συναλλαγή Β υπολογίζει λάθος το συνολικό ποσό σε 200.000. Το πρόβλημα θα λυνόταν αν η Συναλλαγή Β ξαναδιάβαζε το Υπόλοιπο Α που θα το έβλεπε πλέον μειωμένο κατά 50.000. Το συγκεκριμένο πρόβλημα λέγεται ανεπανάληπτη ανάγνωση (unrepeatable read) γιατί αν επαναλαμβανόταν στο τη Συναλλαγή Β η ανάγνωση του Υπολοίπου Α δε θα υπήρχε πρόβλημα
Μηχανισμοί Προστασίας Λόγω των προβλημάτων που αναφέρθηκαν τα ΣΔΒΔ περιλαμβάνουν έναν Διαχειριστή του Ελέγχου Ταυτοχρονισμού (Concurrency Control Manager) που επιλύει αυτόματα τέτοια θέματα. Ο βασικός μηχανισμός είναι τα κλειδώματα (locks). Η βασική ιδέα είναι ότι όταν μια συναλλαγή θέλει να διαβάσει ή να τροποποιήσει μια τιμή θα αιτηθεί το αντίστοιχο κλείδωμα (ανάγνωσης ή εγγραφής).
Πηγές: Database Systems: A Practical Approach to Design, Implementation, and Management Thomas Connolly Carolyn Begg Βάσεις Δεδομένων, ΤΕΕ Β Τάξη, 1 ος Κύκλος, Ινστιτούτο Τεχνολογίας Υπολογιστών και Εκδόσεων «Διόφαντος»