ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Πανεπιστήμιο Πειραιώς Τμήμα Ψηφιακών Συστημάτων Μανουσόπουλος Χρήστος cman@unipi.gr
Δοσοληψίες (Transactions) Μέχρι στιγμής θεωρούσαμε πως υπάρχει μόνο ένας DB χρήστης που εκτελεί μία SQL δήλωση κάθε φορά. Στην πραγματικότητα όμως, ένα σύστημα βάσεων δεδομένων μπορεί να έχει πολλούς παράλληλους χρήστες. Κάθε χρήστης μπορεί να συντάξει μια σειρά από SQL δηλώσεις, οι οποίες στο σύνολο τους αποτελούν μια λογική μονάδα (δοσοληψία - transaction). Η δοσοληψία είναι μια μονάδα εργασίας που εκτελείται σε μια βάση δεδομένων. Είναι μονάδες ή ακολουθίες εργασίας που εκτελούνται σε λογική σειρά, είτε με χειροκίνητο τρόπο από κάποιον χρήστη είτε αυτόματα από κάποιο σύστημα Βάσεων Δεδομένων. Το σύστημα βάσεων δεδομένων είναι υπεύθυνο να ζητήσει τις SQL δηλώσεις από διαφορετικούς χρήστες με έναν τρόπο, ώστε να παράγει τα ίδια αποτελέσματα που θα παράγονταν στην περίπτωση που οι δηλώσεις θα εκτελούνταν σε ένα σενάριο ενός μοναδικού χρήστη(serializable).
Δοσοληψίες (Transactions) A transaction is a sequence of one or more SQL statements that together form a logical piece of work - Groff & Weinberg Μια δοσοληψία είναι η εφαρμογή μιας ή περισσοτέρων αλλαγών στη βάση δεδομένων. Για παράδειγμα εάν δημιουργούμε ή διαγράφουμε ή τροποποιούμε μια εγγραφή σε έναν πίνακα, τότε εκτελούμε μια δοσοληψία στον πίνακα. Είναι σημαντικό ο έλεγχος των δοσοληψιών για να εξασφαλίζουμε ακεραιότητα δεδομένων και να χειριστούμε σφάλματα της βάσης δεδομένων. Πρακτικά, ομαδοποιούμε πολλές δηλώσεις SQL σε ένα σύνολο και τα εκτελούμε όλα μαζί ως δοσοληψία. όλες οι δηλώσεις πρέπει να εκτελεστούν επιτυχώς. Σε αντίθετη περίπτωση ΚΑΜΙΑ δεν πρόκειται να εκτελεστεί. μερικές δοσοληψίες ΔΕΝ γίνονται ποτέ επιτρεπτές. Μια σταθερή κατάσταση βάσης δεδομένων είναι αυτή στην οποία ικανοποιούνται όλοι οι περιορισμοί που έχουν τεθεί, αναφορικά με την ακεραιότητα των δεδομένων.
Δοσοληψίες (Ιδιότητες) Οι δοσοληψίες έχουν τις ακόλουθες τέσσερις απαραίτητες ιδιότητες, στις οποίες αναφερόμαστε με το ακρωνύμιο ACID: Ατομικότητα (Atomicity): διασφαλίζει ότι όλες οι ενέργειες στη μονάδα εργασίας θα ολοκληρωθούν επιτυχώς. Αλλιώς, η δοσοληψία ματαιώνεται στο σημείο αποτυχίας και όλες οι προηγούμενες ενέργειες επιστρέφουν (roll back) στη προηγούμενη κατάσταση. Account transfer debit and credit both succeeded or both failed Συνέπεια (Consistency): Διασφαλίζει ότι η βάση δεδομένων αλλάζει καταστάσεις σωστά μετά από μια επιτυχημένη εκτελεσμένη δοσοληψία. If order detail cannot be written, order header is rolled back Απομόνωση (Isolation): δίνει τη δυνατότητα στις δοσοληψίες να εκτελούνται ανεξάρτητα η μια απ την άλλη και τα αποτελέσματα της μιας δεν είναι ορατά στις υπόλοιπες έως ότου ολοκληρωθεί επιτυχώς. Account transfer debit and credit either both seen or neither is seen Αντοχή (Durability): διασφαλίζει ότι το αποτέλεσμα ή η συνέπεια μιας σωστά εκτελεσμένης δοσοληψίας επιβιώνει σε περίπτωση ανεπάρκειας συστήματος (system failure). Account balance is maintained
Transaction control Τα περισσότερα εμπορικά SQL προϊόντα ακολουθούν το ANSI/ISO Transaction Model, το οποίο προσδιορίζει τους ρόλους των COMMIT και ROLLBACK. Μια δοσοληψία αρχικοποιείται από την πρώτη SQL δήλωση που εκτελείται. Θεωρείται δεδομένο ότι κάθε SQL δήλωση αντιμετωπίζεται ως ξεχωριστή δοσοληψία. Ο έλεγχος των δοσοληψιών γίνεται με τις παρακάτω εντολές: COMMIT: για να αποθηκευτούν οι αλλαγές. ROLLBACK: για επιστροφή στη προηγούμενη κατάσταση. SAVEPOINT: δημιουργεί σημεία μέσα σε σύνολα δοσοληψιών στα οποία να γίνεται το ROLLBACK SET TRANSACTION: δίνει όνομα στη δοσοληψία. Οι εντολές ελέγχου δοσοληψιών χρησιμοποιούνται μόνο με τις εντολές DML INSERT, UPDATE και DELETE.
Transaction control Σύνταξη δοσοληψίας: BEGIN TRANSACTION [transaction_name]; <sequence of SQL statements> COMMIT; or ROLLBACK; Π.χ. BEGIN TRANSACTION; DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 13; COMMIT; Το ANSI / ISO Transaction Model προσδιορίζει ότι: O επιτυχής τερματισμός του προγράμματος σηματοδοτεί το τέλος της δοσοληψίας και την πραγματοποίηση ανανεώσεων στα δεδομένα Ο μη φυσιολογικός τερματισμός του προγράμματος σταματά τη δοσοληψία και οι ανανεώσεις των δεδομένων αναιρούνται.
Transaction control Η εντολή COMMIT; Η εντολή COMMIT χρησιμοποιείται για να σωθούν οι αλλαγές που προκαλέστηκαν από μια δοσοληψία στη βάση δεδομένων. Σώζει όλες τις δοσοληψίες στη βάση δεδομένων από τη τελευταία εντολή COMMIT ή ROLLBACK. Τα δεδομένα που έχουν εισαχθεί και ανανεωθεί στη ΒΔ διατηρούνται που σημαίνει ότι η δοσοληψία δεν μπορεί να γυρίσει σε προηγουμένη φάση, παρά μόνο στην περίπτωση που εκτελεστεί το αντίθετο σύνολο των δηλώσεων με αντίστροφη σειρά Σύνταξη COMMIT; Η εντολή ROLLBACK; Η εντολή χρησιμοποιείται για να αναιρεθούν όλες οι δοσοληψίες που δεν έχουν σωθεί στη βάση δεδομένων. Μπορεί να αναιρέσει δοσοληψίες από το τελευταίο COMMIT ή ROLLBACK. Σύνταξη ROLLBACK;
Transaction control Η εντολή SAVEPOINT; Ένα SAVEPOINT το σημείο σε μια δοσοληψία όπου μπορούμε να κάνουμε rollback χωρίς να κάνουμε rollback ολόκληρη την δοσοληψία. Σύνταξη SAVEPOINT SAVEPOINT_NAME; Για να αναιρέσουμε τις αλλαγές που προκύπτουν από μια ομάδα συναλλαγών χρησιμοποιούμε την παρακάτω εντολή. Σύνταξη ROLLBACK TO SAVEPOINT_NAME; Η RELEASE SAVEPOINT εντολή χρησιμοποιείται για να αφαιρέσουμε ένα SAVEPOINT που έχουμε δημιουργήσει. Σύνταξη RELEASE SAVEPOINT SAVEPOINT_NAME;
Transaction logs Με ποιο τρόπο το ΣΔΒΔ σταματά μια δοσοληψία? Τα περισσότερα συστήματα διατηρούν Transaction Logs που καταγράφουν όλες τις λειτουργίες, όπως και τις COMMIT δηλώσεις. όταν πραγματοποιείται ένα ROLLBACK, εξετάζεται το log και οι λειτουργίες αναιρούνται σε ανάποδη χρονολογική σειρά, μέχρι το πιο πρόσφατο COMMIT. Όταν η δοσοληψία δεν πραγματοποιήθηκε εξαιτίας software/hardware σφάλματος, το ΣΔΒΔ επικαλείται ένα εργαλείο επανόρθωσης (recovery utility), ώστε να επαναφέρει το log και μετά να κάνει rollback όλες τις λειτουργίες που δεν έχουν πραγματοποιηθεί. Το log συνήθως αποθηκεύονται σε διαφορετικό σημείο από την ΒΔ, προκειμένου να αποφευχθεί προσπάθεια πρόσβασης.
Παραδείγματα Δοσοληψιών στον SQL Server Π.χ.1 use lab_db; BEGIN TRAN; delete from orders WHERE customer_id is null; IF @@ROWCOUNT = 5 COMMIT TRAN; ELSE ROLLBACK TRAN; Π.χ.2 Begin Tran; SAVE Transaction SP1; DELETE FROM categories WHERE category_id = 1; SAVE Transaction SP2 ; DELETE FROM categories WHERE category_id = 2 ; SAVE Transaction SP3 ; DELETE FROM categories WHERE category_id = 3; Rollback transaction SP2;
Read only Δοσοληψίες Μια δοσοληψία που απλώς διαβάζει μια ΒΔ και δεν γράφει σε αυτή, μπορεί εύκολα να σειριοποιηθεί με άλλες read-only δοσοληψίες. Αυτό σημαίνει ότι οι read-only δοσοληψίες δεν χρειάζεται να περιμένουν η μία να ολοκληρωθεί η άλλη. Για να ορίσουμε ότι η επόμενη δήλωση πρόκειται να είναι readonly, γράφουμε το εξής: SET TRANSACTION READ ONLY;
Serializability (1/2) Θεωρείστε δυο χρήστες που θέλουν ταυτόχρονα να κλείσουν μια θέση για μια συγκεκριμένη πτήση: βρίσκουν μια άδεια θέση και κάνουν την κράτηση (τη θέτουν occupied). Σε ένα σύστημα χωρίς περιορισμούς, οι λειτουργίες τους θα μπορούσαν να εκτελεστούν με τη συγκεκριμένη σειρά: T1: find empty seat 22A, T2: find empty seat 22A, ποιος χρήστης θα κρατήσει τελικά τη θέση 22A? book seat 22A time book seat 22A Για να αποφύγουμε αυτό το πρόβλημα, πρέπει να θεωρήσουμε τη συνέχεια των ερωτημάτων της δοσοληψίας ενός χρήστη ως μια μονάδα. ερωτήματα από δύο διαφορετικές δοσοληψίες χρηστών πρέπει να μπουν σε μια σειρά, έτσι ώστε και οι δύο δοσοληψίες να εκτελούνται σειριακά. Στο παράδειγμα, είτε ο χρήστης 1 ή ο χρήστης 2 θα κρατήσει τη θέση 22A. Ο άλλος χρήστης θα δει τη θέση 22A ως occupied και θα πρέπει να βρει άλλη θέση.
Serializability(2/2) Η Σειριοποιησιμότητα (Serializability) συνήθως διασφαλίζεται μέσω του κλειδώματος (locking) των αντικειμένων της ΒΔ ως read ή written. Πριν να διαβαστεί ή να εγγραφεί ένα αντικείμενο ΒΔ (πίνακας ή πλειάδα), η δοσοληψία πρέπει να εξασφαλίσει το κατάλληλο κλείδωμα. Τα κλειδώματα συνήθως ελευθερώνονται μόνο κατά το τέλος της δοσοληψίας. Εάν μια δοσοληψία δεν μπορεί να πάρει το κλείδωμα που του ζητήθηκε, πρέπει να περιμένει έως ότου απελευθερωθεί από μια άλλη δοσοληψία που το έχει την τρέχουσα χρονική στιγμή.
Μέχρι αυτή τη στιγμή, έχουμε θεωρήσει ότι όλες οι SQL δηλώσεις εκτελούνται σωστά. Στην πραγματικότητα, μπορούν να συμβούν πολλοί τύποι σφαλμάτων στο σύστημα, κατά την εκτέλεση της δοσοληψίας ενός χρήστη Τη στιγμή που το σύστημα παρουσιάζει σφάλμα η δοσοληψία θεωρείται μη ολοκληρωμένη. Ωστόσο κάποιες SQL δηλώσεις μπορούν να έχουν εκτελεστεί. Έστω μια δοσοληψία τραπέζης T: T: A=A+100, B=B-100 Η δοσοληψία T μεταφέρει 100 από το λογαριασμό του B στο λογαριασμό του A. Τι συμβαίνει αν το σύστημα παρουσιάζει σφάλμα ακριβώς μετά την εκτέλεση της πρώτης δήλωσης της Τ?
Παράδειγμα ACID Ιδιοτήτων (1/4) Έστω ότι θέλουμε να μεταφέρουμε 50 από το λογαριασμό Α στο λογαριασμό Β. read(a); A := A -50; write(a); read(b); B := B + 50; Η ΒΔ «βλέπει»: R(A); W(A); R(B); W(B); Σύμφωνα με τις ιδιότητες ACID πρέπει κατά τη διάρκεια της δοσοληψίας να διασφαλίζονται: Ατομικότητα, Συνέπεια, Απομόνωση και Αντοχή.
Παράδειγμα ACID Ιδιοτήτων (2/4) Ατομικότητα H δοσοληψία αποτελείται από πολλές ενέργειες, όμως για διάφορους λόγους μπορεί να εκτελεστούν μερικές μόνο από αυτές. Αυτό έχει ως αποτέλεσμα να παραβιαστούν κάποιοι κανόνες και μαζί μ αυτούς και η συνέπεια της βάσης. Αν η δοσοληψία του παραδείγματος αποτύχει μετά το βήμα 3, το σύστημα θα πρέπει να εξασφαλίζει ότι τα updates του δεν αντανακλώνται στη βάση, εκτός και αν προκύψει μια ασυνέπεια. read(a); A := A -50; write(a); --CRASH-- read(b); B := B + 50;
Παράδειγμα ACID Ιδιοτήτων (3/4) Συνέπεια Tο άθροισμα των δύο λογαριασμών στο τέλος της συναλλαγής, πρέπει να ισούται με το άθροισμά τους στην αρχή. Υποθέτουμε ότι μια δοσοληψία που ξεκινά να τροποποιεί μια συνεπή ΒΔ, θα καταλήξει επίσης σε συνεπή ΒΔ read(a); A := A - 50; write(a); read(b); B := B + 50; write(b);
Παράδειγμα ACID Ιδιοτήτων (4/4) Απομόνωση Ας υποθέσουμε ότι στο σύστημα τρέχουν περισσότερες από μια δοσοληψίες ταυτοχρόνως. Στο παράδειγμα ανάμεσα στα βήματα 3 και 6 θεωρούμε ότι μια άλλη δοσοληψία επιτρέπεται να αποκτήσει πρόσβαση στη μερικώς ενημερωμένη βάση δεδομένων. Τότε αφού αυτή μπορεί να δει τα ενδιάμεσα αποτελέσματα της άλλης μπορεί να προκληθούν ανεπιθύμητα αποτελέσματα (π.χ. το άθροισμα Α+Β να είναι μικρότερο από αυτό που θα έπρεπε να είναι). Αυτό συμβαίνει γιατί στο μέσο της δοσοληψίας η βάση μπορεί να είναι ασυνεπής. Αντοχή Κάθε φορά που ο χρήστης ειδοποιείται ότι η συναλλαγή έχει ολοκληρωθεί, η ενημέρωση της βάσης από τη συναλλαγή πρέπει να διατηρηθεί παρά τις αποτυχίες του συστήματος.