ΠΑΝΕΠΙΣΗΜΙΟ ΠΕΙΡΑΙΩ ΣΜΗΜΑ ΨΗΦΙΑΚΩΝ ΤΣΗΜΑΣΩΝ ΒΑΣΕΛΣ ΔΕΔΟΜΕΝΩΝ ΕΓΑΣΤΘΛΟ 5 ΔΕΣΡΟΛΝΑ ΡΑΡΑΚΩΝΣΤΑΝΤΛΝΟΥ dpap@unipi.gr
ΔΟΣΟΛΗΨΙΕΣ ΣΥΝΕΧΕΙΑ
CONCURRENT DATA ACCESS Είναι αρκετά ςφνθκεσ πολλοί χριςτεσ να ζχουν ταυτόχρονθ πρόςβαςθ ςε μια ΒΔ. Μερικοί από τουσ λόγουσ είναι: Καλφτερθ διαβίβαςθ δεδομζνων ςε μια δοςολθψία, κακϊσ και μικρότεροσ χρόνοσ απόκριςθσ Καλφτερθ χριςθ των πθγϊν (π.χ. τθ ςτιγμι που μια διαδικαςία διαβάηει το δίςκο, κάποια άλλθ μπορεί να χρθςιμοποιεί τθ CPU ι να διαβάηει άλλο δίςκο ΚΛΝΔΥΝΟΣ: ταυτόχρονεσ ενζργειεσ μπορεί να οδθγιςουν ςε ςφάλματα. ΡΟΒΛΘΜΑΤΑ Lost Update Problem: το πρϊτο update χάκθκε, το δεφτερο γράφει πάνω ςτο πρϊτο. Θ ΒΔ είναι ςε μία αςυνεπι κατάςταςθ, αφοφ επετράπθ ςτθ Δοςολθψία Β να προςβάςει τα ίδια δεδομζνα με αυτά τθσ Δοςολθψίασ Α πριν ολοκλθρωκεί. Uncommitted Dirty Data Problem: θ Δοςολθψία B τροφοδοτείται με ανολοκλιρωτα δεδομζνα από τθ Δοςολθψία A (δεν ζχουν γίνει ακόμθ commit), κάτι που μπορεί να οδθγιςει ςε μια λανκαςμζνθ απόφαςθ. Inconsistent Phantom Data Problem: θ Δοςολθψία Β εκτελεί το ίδιο επερϊτθμα για δεφτερθ φορά, αλλά επιςτρζφει διαφορετικά αποτελζςματα.
ΡΟΒΛΘΜΑ: THE LOST UPDATE Συμβαίνει όταν μία ι περιςςότερεσ δοςολθψίεσ προςπακοφν να κάνουν update οποιοδιποτε εγγραφι ςε μια δεδομζνθ χρονικι ςτιγμι, όταν δθλαδι ζνα update γράφεται επιτυχϊσ ςτθ ΒΔ, αλλά κατά λάκοσ ζνα δεφτερο update μιασ άλλθσ δοςολθψίασ γράφει πάνω από τθν προθγοφμενθ πλθροφορία. Ραράδειγμα (αεροπορικζσ κρατιςεισ): Ο Ρελάτθσ 1 βρίςκει μια κενι κζςθ. Ο Ρελάτθσ 2 βρίςκει κενι τθν ίδια κζςθ, πριν ο Ρελάτθσ 1 ολοκλθρϊςει τθν κράτθςθ του. Ο Ρελάτθσ 1 κάνει τθν κράτθςθ τθσ κζςθσ. Ο Ρελάτθσ 2 κάνει τθν κράτθςθ τθσ κζςθσ.
ΡΟΒΛΘΜΑ: NON-REPEATABLE READS / PHANTOM DATA Non-repeatable reads: Ζνα non-repeatable read ςυμβαίνει όταν μια δοςολθψία διαβάηει τθν ίδια γραμμι δφο φορζσ, αλλά παίρνει διαφορετικά δεδομζνα/αποτελζςματα κάκε φορά. Για παράδειγμα, ασ υποκζςουμε ότι θ δοςολθψία 1 διαβάηει μια ςειρά. Θ δοςολθψία 2 ενθμερϊνει ι διαγράφει αυτι τθ γραμμι και κάνει commit. Αν θ δοςολθψία 1 ξαναδιαβάςει τθ γραμμι, κα ανακτιςει διαφορετικζσ τιμζσ ι κα ανακαλφψει ότι θ ςειρά ζχει διαγραφεί. Non-repeatable read: Αν κάποιοσ εκτελζςει UPDATE ι DELETE οποιαςδιποτε γραμμισ που διαβάςαμε προθγουμζνωσ. Phantom: Ζνα phantom είναι μια γραμμι που ταιριάηει με τα κριτιρια αναηιτθςθσ, αλλά δεν είναι αρχικά ορατι. Συμβαίνει όταν εκτελοφνται δφο όμοια queries και οι εγγραφζσ που επιςτρζφονται από το δεφτερο query είναι διαφορετικζσ από αυτζσ του πρϊτου. Για παράδειγμα, ασ υποκζςουμε ότι θ δοςολθψία 1 διαβάηει/επιλζγει μια ςειρά γραμμϊν που πλθροφν οριςμζνα κριτιρια αναηιτθςθσ και θ δοςολθψία 2 δθμιουργεί μια νζα γραμμι που ταιριάηει με τθ γραμμι αναηιτθςθσ τθσ δοςολθψίασ 1. Αν θ δοςολθψία 1 εκτελζςει εκ νζου τθν εντολι που διαβάηει τισ γραμμζσ, κα λάβει ζνα διαφορετικό ςφνολο γραμμϊν. Phantom: Αν κάποιοσ INSERTED μια γραμμι μζςα ςτα πλαίςια που είχαμε ςτο προθγοφμενο query (πχ βλζπουμε νζεσ γραμμζσ).
ΡΟΒΛΘΜΑ: DIRTY DATA Dirty reads: Ζνα dirty read ςυμβαίνει όταν μια δοςολθψία διαβάηει δεδομζνα τθ ςτιγμι που μια άλλθ δοςολθψία κάνει κάποιο update που δεν ζχει γίνει ακόμθ commit. Είναι ζνασ τφποσ Non-repeatable Reads. Για παράδειγμα, ασ υποκζςουμε ότι θ δοςολθψία 1 ενθμερϊνει μια ςειρά. Θ δοςολθψία 2 διαβάηει τθν επικαιροποιθμζνθ γραμμι πριν θ δοςολθψία 1 κάνει commit τθν ενθμερωμζνθ ζκδοςθ. Αν θ δοςολθψία 1, επαναφζρει τθν αλλαγι, θ δοςολθψία 2 κα ζχει διαβάςει δεδομζνα που ποτζ δεν υπιρξαν. Τα Dirty data είναι δεδομζνα που τροποποιικθκαν από μια δοςολθψία που δεν είχε ακόμθ ολοκλθρωκεί. Ραράδειγμα (αεροπορικζσ κρατιςεισ): Ο Ρελάτθσ 1 βρίςκει μια κενι κζςθ και τθν κρατάει Ο Ρελάτθσ 2 δε βρίςκει κζςθ, οπότε και αναηθτά κζςθ ςτθν επόμενθ πτιςθ Ο Ρελάτθσ 1 βρίςκει τθν τιμι πολφ υψθλι, οπότε ακυρϊνει τθν κράτθςθ Ο Ρελάτθσ 2 δεν ενθμερϊνεται ότι θ κζςθ είναι ελεφκερθ.
ΕΡΛΡΕΔΑ ΑΡΟΜΟΝΩΣΘΣ (ISOLATION LEVELS)
ΕΡΛΡΕΔΑ ΑΡΟΜΟΝΩΣΘΣ (ISOLATION LEVELS) (1/4) Θ SQL προςδιορίηει τζςςερα επίπεδα απομόνωςθσ (isolation levels) -> πρόκειται για επιλογζσ αναφορά με το ποιεσ αλλθλεπιδράςεισ επιτρζπονται από τισ δοςολθψίεσ που εκτελοφνται τθν ίδια περίπου χρονικι ςτιγμι. Ο όροσ επίπεδο απομόνωςθσ χρθςιμοποιείται για να υποδθλϊςει αυτό που λζμε βακμό παρεμβολισ, τον οποίο μπορεί να ανεχκεί μια δεδομζνθ ςυναλλαγι όςον αφορά τισ ταυτόχρονεσ ςυναλλαγζσ. Στθν πραγματικότθτα, δεν υπάρχει κανζνασ λόγοσ να μθ λειτουργεί μια δοςολθψία ςε διαφορετικά επίπεδα απομόνωςθσ τθν ίδια ςτιγμι, ςε διαφορετικά μζρθ τθσ βάςθσ δεδομζνων. Κάκε ΣΔΒΔ υλοποιεί δοςολθψίεσ με το δικό τθσ τρόπο. Το προεπιλεγμζνο SQL επίπεδο απομόνωςθσ διαςφαλίηει ςειριοποιθςιμότθτα. Ταυτόχρονεσ δοςολθψίεσ μποροφν να εκτελοφνται ςε διαφορετικά επίπεδα απομόνωςθσ. Τα inserts, updates, και deletes ςυμπεριφζρονται πάντα το ίδιο όποιο επίπεδο απομόνωςθσ και να ζχουμε, μόνο με τα select statements ποικίλλει το αποτζλεςμα. 8
ΕΡΛΡΕΔΑ ΑΡΟΜΟΝΩΣΘΣ (ISOLATION LEVELS) (2/4) Μια ειδικι εντολι που ονομάηεται SET TRANSACTION χρθςιμοποιείται για να ορίςει κάποια χαρακτθριςτικά τθσ νζασ ςυναλλαγισ που κα ξεκινιςει. Χαρακτθριςτικά αυτισ τθσ εντολισ είναι ο τρόποσ προςπζλαςθσ και το επίπεδο απομόνωςθσ. Μζςα ςε μια δοςολθψία μποροφμε να ποφμε: SET TRANSACTION ISOLATION LEVEL X where X = SERIALIZABLE REPEATABLE READ READ COMMITTED READ UNCOMMITTED Θ ςθμαςιολογία των 4 επιπζδων απομόνωςθσ δίνεται από τον πίνακα: Isolation Level Read Uncommitted Write locks No Read locks No View locks No Read Committed Yes No No Repeatable Reads Yes Yes No Serializable Yes Yes Yes
ΕΡΛΡΕΔΑ ΑΡΟΜΟΝΩΣΘΣ (ISOLATION LEVELS) (3/4) READ COMMITTED (ΑΝΑΓΝΩΣΘ ΕΡΛΚΥΩΜΕΝΩΝ) Επιτρζπει ςε μια δοςολθψία να βλζπει ενδιάμεςα αποτελζςματα άλλων δοςολθψιϊν όταν αυτά γίνουν COMMITED. ΡΟΒΛΘΜΑ -> NON REPEATABLE READS (προχωρά ςε κλείδωμα κατά τθν ανάγνωςθ δεδομζνων για να αποφφγει τα dirty reads, αλλά τα δεδομζνα μπορεί να αλλάξουν πριν το τζλοσ τθσ δοςολθψίασ, καταλιγοντασ ζτςι ςε non repeatable reads ι phantom data). Είναι δθλαδι δυνατό μια άλλθ δοςολθψία να τροποποιιςει μια τιμι που ζχει διαβάςει θ δοςολθψία, ενϊ βρίςκεται ςε εξζλιξθ. Επίςθσ θ δοςολθψία είναι εκτεκειμζνθ ςτο phantom πρόβλθμα. READ UNCOMMITTED (ΑΝΑΓΝΩΣΘ ΑΝΕΡΛΚΥΩΤΩΝ) Επιτρζπει τθν ανάγνωςθ δεδομζνων που δεν ζχουν γίνει COMMIT (uncommitted ι dirty data), δθλαδι κάποιεσ τιμζσ ι εγγραφζσ μπορεί να εμφανιςτοφν ι να εξαφανιςτοφν πριν ολοκλθρωκεί το transaction. Ουςιαςτικά επιτρζπει ςε μια δοςολθψία να βλζπει ενδιάμεςα αποτελζςματα άλλων δοςολθψιϊν, πριν αυτζσ ολοκλθρωκοφν. Εδϊ ειςάγεται το πρόβλθμα τθσ αναξιόπιςτθσ ανάγνωςθσ (dirty reads), δθλαδι μια δοςολθψία μπορεί να διαβάςει μια γραμμι δοςολθψίασ που μόλισ ζχει ενθμερωκεί ενϊ μετά αυτι κάνει ROLLBACK. Είναι το λιγότερο περιοριςτικό από τα τζςςερα isolation levels, διαβεβαιϊνει μόνο ότι καταςτρεμμζνα δεδομζνα δεν μποροφν να διαβαςτοφν.
ΕΡΛΡΕΔΑ ΑΡΟΜΟΝΩΣΘΣ (ISOLATION LEVELS) (4/4) REPEATABLE READ (ΕΡΑΝΑΛΘΨΛΜΘ ΑΝΑΓΝΩΣΘ) Επιβάλλει κλείδωμα ςε όλεσ τισ εγγραφζσ (δεδομζνα) που ςυμμετζχουν ςε ζνα query. Ουςιαςτικά λφνει το πρόβλθμα των dirty reads κι επιτρζπει ςε μια δοςολθψία να κάνει ςτακερζσ αναγνϊςεισ. Πταν διαβάςει κάτι εξακολουκεί να το βλζπει ακόμα και αν μια άλλθ δοςολθψία το ζχει αλλάξει (phantoms). SERIALIZABLE Μπορεί να διαβάςει μόνο committed δεδομζνα, ζτςι ϊςτε να αποφεφγονται τα dirty reads. Επιπλζον, κλειδϊνει τα αντικείμενα που διαβάηει, ζτςι ϊςτε καμία άλλθ δοςολθψία να μθν είναι ςε κζςθ να αλλάξει τισ τιμζσ αυτϊν των αντικειμζνων. Με αυτό τον τρόπο αποφεφγονται τα non-repeatable reads. Τζλοσ, κλειδϊνει όλο το εφροσ των τιμϊν που επθρεάηει ζτςι ϊςτε καμία άλλθ ςυναλλαγι να μθν μπορεί να αλλάξει αυτό το εφροσ. Με αυτό τον τρόπο αποφεφγει τα phantoms.
ΕΡΛΡΕΔΑ ΑΡΟΜΟΝΩΣΘΣ ΧΘΣΘ, ΡΟΤΕΘΜΑΤΑ, ΜΕΛΟΝΕΚΤΘΜΑΤΑ (1/2) READ COMMITTED Κετικά: καλι ιςορροπία μεταξφ ταυτοχρονιςμοφ (concurrency) και ςυνζπειασ (consistency). Αρνθτικά: τα δεδομζνα μποροφν να αλλάξουν όταν προςπελαφνονται πολλζσ φορζσ μζςα ςτθν ίδια δοςολθψία. Χριςθ: πολφ ςυχνό isolation level. Είναι το προεπιλεγμζνο isolation level του SQL Server. READ UNCOMMITTED Κετικά: δεν χρειάηονται κλειδϊματα διαβάςματοσ για να διαβαςκοφν τα δεδομζνα. Αρνθτικά: τα δεδομζνα δε διαςφαλίηεται ότι κα είναι ςυνεπι. Χριςθ: χρθςιμοποιείται ςε queries/applications, όπου θ αςυνζπεια των δεδομζνων δεν πρόκειται να είναι μεγάλο πλιγμα, πχ ςτον υπολογιςμό τθσ μζςθσ τιμι των μιςκϊν εργαηομζνων.
ΕΡΛΡΕΔΑ ΑΡΟΜΟΝΩΣΘΣ ΧΘΣΘ, ΡΟΤΕΘΜΑΤΑ, ΜΕΛΟΝΕΚΤΘΜΑΤΑ (2/2) REPEATABLE READ Κετικά: καλφτερθ ςυνζπεια των δεδομζνων. Αρνθτικά: τα κλειδϊματα διατθροφνται για όλθ τθ διάρκεια τθσ δοςολθψίασ, γεγονόσ που μπορεί να μειϊςει τον ταυτοχρονιςμό (concurrency). Δεν προςτατεφει από τισ phantom γραμμζσ. Χριςθ: δεν είναι πολφ ςυχνό. SERIALIZABLE Κετικά: πλιρθ ςυνζπεια των δεδομζνων, κακϊσ και προςταςία από phantom γραμμζσ. Καμία δοςολθψία δεν εμπλζκεται ςε άλλθ. Για παράδειγμα, αν ζχουμε τισ δοςολθψίεσ T1, T2, T3 που εκτελοφνται ςε serializable isolation level, οι πικανζσ ςειρζσ που κα εκτελεςτοφν πρόκειται να είναι οι εξισ: (T1, T2, T3), (T1, T3, T2), (T2, T1, T3), (T2, T3, T1), (T3, T1, T2), (T3, T2, T1). Αρνθτικά: τα κλειδϊματα διατθροφνται για όλθ τθ διάρκεια τθσ δοςολθψίασ, γεγονόσ που μπορεί να μειϊςει τον ταυτοχρονιςμό (concurrency). Χριςθ: χρθςιμοποιείται ςτισ περιπτϊςεισ που θ ςυνζπεια των δεδομζνων είναι προχπόκεςθ.
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 1 Αρχικά δθμιουργιςτε ζνα πίνακα InnoDB με όνομα Τ1 και γνωρίςματα L1, K1 που δείχνουν το pin λογαριαςμοφ και το υπόλοιπο του κάκε λογαριαςμοφ αντιςτοίχωσ. CREATE TABLE T1 (L1 INT NOT NULL, K1 INT, PRIMARY KEY (L1)); Ειςάγετε ςε αυτόν τισ παρακάτω εγγραφζσ : INSERT INTO T1 VALUES(006, 600); INSERT INTO T1 VALUES(007, 900); INSERT INTO T1 VALUES(008, 1000); INSERT INTO T1 VALUES(009, 1100); Δίνοντασ τϊρα τθν εντολι: SELECT * FROM T1; βλζπουμε για το table T1 τον παρακάτω πίνακα που δείχνει πωσ ζχουν μζχρι τϊρα οι εγγραφζσ ςτο T1: L1 Κ1 006 600 007 900 008 1000 009 1100
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 1 Ο κάτοχοσ του λογαριαςμοφ με pin 009 ζκανε κατάκεςθ και πλζον το υπόλοιπο του λογαριαςμό του αντιςτοιχεί ςε 10000 ευρϊ. Υλοποιιςτε τθν ενθμζρωςθ Απάντθςθ: BEGIN TRANSACTION UPDATE Τ1 SET K1=10000 WHERE K1=1100 Με τθν παραπάνω πράξθ ενθμζρωςθσ τθσ Τ1 αντικακιςτοφμε τθν τιμι 1100 τθσ Κ1 με τθν τιμι 10000. Αυτό φαίνεται από τον παρακάτω πίνακα που προκφπτει αν δϊςουμε πάλι μια select μζςα ςτθν transaction. L1 Κ1 SELECT * FROM T1; Δοκιμάςτε τα αποτελζςματα κάνοντασ rollback transaction και commit transaction 006 600 007 900 008 1000 009 10000
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 2 Ο κάτοχοσ του λογαριαςμοφ με pin κάρτασ 007 βρίςκεται ςε ζνα τραπεηικό κατάςτθμα και προςπακεί να κάνει κατάκεςθ μεταβάλλοντασ το υπόλοιπο ςε 10500 ευρϊ, ενϊ τθν ίδια ςτιγμι ο γιοσ του προςπακεί να κάνει ανάλθψθ από ζνα ΑΤΜ και να μεταβάλλει τον ίδιο λογαριαςμό από 900 ςε 400 ευρϊ. Υλοποιιςτε τθν παραπάνω ςυναλλαγι. Απάντθςθ: Ξεκινάμε τθν πρϊτθ δοςολθψία BEGIN TRANSACTION; UPDATE Τ1 SET K1=10500 WHERE K1=900; Και ςυνεχίηουμε με τθν δεφτερθ BEGIN TRANSACTION; (Αν εκτελζςουμε ωσ εδϊ ζνα Select * from T1 βλζπουμε ότι οι αλλαγζσ που ζκανε θ πρϊτθ δοςολθψία δεν είναι ορατζσ ςτθ δεφτερθ).
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 2 Συνεχίηουμε ωσ εξισ: UPDATE T1 SET K1=10800 WHERE K1=900; Ασ δοφμε τϊρα πάλι με ζνα Select * from T1 αν θ δεφτερθ δοςολθψία πραγματοποιικθκε. Το αποτζλεςμα που πιραμε είναι ότι θ δεφτερθ δοςολθψία ΔΕΝ ζχει πραγματοποιθκεί! Αυτό οφείλεται ςε μια τεχνικι ελζγχου του ταυτοχρονιςμοφ που ονομάηεται κλείδωμα: όταν μια δοςολθψία χρειάηεται διαβεβαίωςθ ότι κάποιο αντικείμενο για το οποίο ενδιαφζρεται δε κα μεταβλθκεί με κάποιον απρόβλεπτο τρόπο ενϊ θ δοςολθψία ζχει γυριςμζνθ τθν πλάτθ τθσ, τότε θ δοςολθψία αποκτά ζνα κλείδωμα ςε αυτό το αντικείμενο. Το αποτζλεςμα του κλειδϊματοσ είναι να αποκλειςτοφν οι άλλεσ δοςολθψίεσ από το αντικείμενο, και ζτςι να μθν μποροφν να το μεταβάλουν. Για να εκτελεςτεί θ δεφτερθ δοςολθψία πρζπει να κλείςει πρϊτα θ πρϊτθ ςυναλλαγι με μια διλωςθ COMMIT ι ROLLBACK. Τότε κα δοφμε ότι θ δεφτερθ ξεμπλοκάρει και αρχίηει να εκτελείται και θ ίδια. Θ βάςθ δεδομζνων τθν κάνει αυτόματα ROLLBACK.
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 3 Δυο άτομα τθν ίδια χρονικι ςτιγμι προςπακοφν να κάνουν μια κατάκεςθ ςτο λογαριαςμό με αρικμό pin 006 ο ζνασ μετατρζποντάσ τον ςε 10.700 ευρϊ και ο άλλοσ ςτον λογαριαςμό 007 μετατρζποντάσ τον ςε 11.500 ευρϊ. Απάντθςθ: Ειςάγουμε τθν πρϊτθ δοςολθψία BEGIN TRANSACTION; UPDATE Τ1 SET Κ1=10700 WHERE Κ1=600; Εκτελοφμε μια COMMIT για να κλείςει θ TR1 και να μονιμοποιθκοφν οι αλλαγζσ ςτθ βάςθ δεδομζνων. Κάνουμε εδϊ μια SELECT * FROM T1 για να δοφμε τθν κατάςταςθ που βρίςκεται το table Τ1 L1 Κ1 006 10700 007 10500 008 1000 009 10000
Ξεκινάμε τϊρα τθν TR2 BEGIN TRANSACTION; UPDATE Τ1 SET Κ1=11500 WHERE Κ1=10500; ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 3 Κάνοντασ εδϊ μια SELECT βλζπουμε όπωσ φαίνεται από τον πίνακα ότι πλζον θ ενθμζρωςθ ςτθ βάςθ δεδομζνων από τθν ΤR2 ζχει γίνει. Για να κλείςουμε τθ δοςολθψία ειςάγουμε μια διλωςθ COMMIT ι ROLLBACK ανάλογα με το αν κζλουμε να διατθριςουμε τισ αλλαγζσ από τθν τρζχουςα δοςολθψία ι όχι. Ασ προςζξουμε ότι οι παραπάνω δοςολθψίεσ υλοποιοφνται ςτο K1 που είναι γνϊριςμα μθ πρωτεφοντοσ κλειδιοφ. L1 Κ1 006 11500 007 10500 008 1000 009 10000
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 4 Οι κάτοχοι των καρτϊν με pin 006 και 007 ζχαςαν τθν κάρτα τουσ και μόλισ το αντιλιφκθςαν ζτρεξαν να αλλάξουν κωδικό. Ο ζνασ το μετατρζπει ςε 001 ενϊ εκείνοσ που είχε το 007 το μετατρζπει ςε 002. Απάντθςθ: BEGIN TRANSACTION; UPDATE Τ1 SET L1=001 WHERE L1=006; Εκτελϊντασ τθ διλωςθ SELECT * FROM T1; βεβαιωνόμαςτε ότι οι αλλαγζσ ζχουν γίνει Εκτελοφμε μια COMMIT για να κλείςει θ TR1 και να μονιμοποιθκοφν οι αλλαγζσ ςτθ βάςθ δεδομζνων. Κάνουμε εδϊ μια SELECT * FROM T1 για να δοφμε τθν κατάςταςθ που βρίςκεται το table Τ1 L1 Κ1 001 11500 007 10500 008 1000 009 10000
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 4 Ρροχωράμε ςτθν εκτζλεςθ τθσ δεφτερθσ δοςολθψίασ BEGIN TRANSACTION; UPDATE Τ1 SET L1=002 WHERE L1=007; Ασ εκτελζςουμε μια SELECT * FROM T1; Το αποτζλεςμα που προκφπτει είναι ο παρακάτω πίνακασ όπου και διαπιςτϊνουμε ότι οι αλλαγζσ από τθν TR2 ζχουν γίνει Οι δυο δοςολθψίεσ εκτελοφνται ταυτόχρονα όταν τα γνωρίςματα που ενθμερϊνουμε αποτελοφν πρωτεφοντα κλειδιά. Εδϊ αποκτοφν κλείδωμα μόνο οι ςυγκεκριμζνεσ εγγραφζσ ενϊ ςτθν περίπτωςθ που δε δροφμε ςε πρωτεφον κλειδί αποκτά κλείδωμα όλοσ ο πίνακασ. L1 Κ1 001 11500 002 10500 008 1000 009 10000
ΑΔΛΕΞΟΔΟ - DEADLOCK Το αδιζξοδο (deadlock) είναι μια κατάςταςθ όπου δυο ι περιςςότερεσ ςυναλλαγζσ είναι ταυτόχρονα ςε κατάςταςθ αναμονισ, και θ κάκε μια περιμζνει μια από τισ άλλεσ να απελευκερϊςει ζνα κλείδωμα, πριν μπορζςει να προχωριςει. Αν ςυμβεί ζνα αδιζξοδο είναι επικυμθτό το ςφςτθμα να το εντοπίςει και να το ςπάςει. Ο εντοπιςμόσ του αδιεξόδου ςθμαίνει τον εντοπιςμό ενόσ κφκλου ςτο γράφθμα αναμονϊν, δθλαδι ςτο γράφθμα που δείχνει ποιοσ περιμζνει ποιον. Σπάςιμο του αδιεξόδου ςθμαίνει να διαλζξουμε για κφμα μια από τισ ςυναλλαγζσ που βρίςκονται ςε αδιζξοδο και να τθν ανακαταςκευάςουμε απελευκερϊνοντασ ζτςι τα κλειδϊματά τθσ και επιτρζποντασ να προχωριςει ςε κάποια άλλθ ςυναλλαγι.
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 5 Δθμιουργιςτε ζναν πίνακα ο οποίοσ κα περιζχει δυο γνωρίςματα, το ζνα από τα δυο κα αντιπροςωπεφει τον κωδικό πτιςθσ μιασ ςυγκεκριμζνθσ αεροπορικισ εταιρίασ και το άλλο τθν ϊρα αναχϊρθςθσ τθσ ςυγκεκριμζνθσ πτιςθσ και ειςάγετε τισ εξισ τιμζσ: (533, 645), (740, 2005),(927, 615),(348, 1700). CREATE TABLE Flights ( Id INT, hour TIME, PRIMARY KEY (Id)); Aσ ειςάγουμε ς αυτόν μερικζσ τιμζσ INSERT INTO Flights VALUES(533, 645); INSERT INTO Flights VALUES(740, 2005); INSERT INTO Flights VALUES(927, 615); INSERT INTO Flights VALUES(348, 1700);
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 5 Λόγω άςχθμων καιρικϊν ςυνκθκϊν ζχουμε ακφρωςθ των πτιςεων με id=740, id=348. Οι παραπάνω πτιςεισ αντικακίςτανται θ μια από τθν 632 με ϊρα αναχϊρθςθσ 21:45 και θ άλλθ από τθν πτιςθ 283 και ϊρα αναχϊρθςθσ 19:00 αντιςτοίχωσ. Ρροςπακιςτε να υλοποιιςετε τισ παραπάνω ςυναλλαγζσ. Απάντθςθ: Ξεκινάμε με τθ δθμιουργία τθσ πρϊτθσ ςυναλλαγισ START TRANSACTION; UPDATE Flights SET Id=632 WHERE Id=740; UPDATE Flights SET hour=2145 WHERE hour=2005; Εκτελοφμε και τθν δεφτερθ START TRANSACTION; UPDATE Flights SET hour=1900 WHERE hour=1700; UPDATE Flights SET Id=283 WHERE Id=348;
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 5 ΤΛ ΣΥΜΒΑΛΝΕΛ? Κάκε μια από τισ δοςολθψίεσ περιμζνει τθν άλλθ να απελευκερϊςει ζνα κλείδωμα για να μπορζςει να προχωριςει. ΑΡΟΤΕΛΕΣΜΑ DEADLOCK Τι κάνει ο Microsoft SQL Server??? Εντοπίηει το deadlock και κάνει από μόνοσ του ROLLBACK και τισ δφο δοςολθψίεσ.
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 6 Ζχουμε πάλι τον πίνακα T1 του Ραραδείγματοσ 4 που το δθμιουργιςαμε ωσ εξισ: CREATE TABLE T1 (L1 INT NOT NULL, K1 INT, PRIMARY KEY (L1)); Κι ζχουμε ειςάγει ςε αυτόν εγγραφζσ, ϊςτε να ζχουμε το εξισ αποτζλεςμα : Υλοποιιςτε μια δοςολθψία που να προςκζτει 200 ευρϊ ςτον λογαριαςμό με pin=008 και ςτθ ςυνζχεια μια δεφτερθ, θ οποία να διαβάηει το ςυνολικό ποςό του λογαριαςμοφ 008 και να προςκζτει το 10% αυτοφ ςτο λογαριαςμό με pin=009. L1 Κ1 001 11500 002 10500 008 1000 009 10000
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 6 Απάντθςθ: Ξεκινάμε τθν πρϊτθ δοςολθψία START TRANSACTION; Πμωσ εδϊ θ δεφτερθ δοςολθψία κζλουμε να κάνει ςτακερζσ αναγνϊςεισ, αφοφ από αυτιν διαβάηει το ςυνολικό ποςό και το μεταφζρει ςτον άλλο λογαριαςμό. Άρα πρζπει να ορίςουμε ςε αυτιν μια set transaction με προεπιλογι SERIALIZABLE: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; Εκτελοφμε τθν πράξθ ενθμζρωςθσ UPDATE T1 SET K1=K1+200 WHERE K1=1000; Με SELECT * FROM T1; βλζπουμε από τον παρακάτω πίνακα ότι θ ενθμζρωςθ πραγματοποιικθκε. L1 Κ1 001 11500 002 10500 008 1200 009 10000
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 6 Και προχωράμε ςτθ δεφτερθ: START TRANSACTION; UPDATE T1 SET K1=0.1 * K1 + 10000 WHERE K1=10000;(πρόςκεςθ 10% από Α) UPDATE T1 SET K1=K1-0.1*K1 WHERE K1=1200; (αφαιροφμε τo 0.1*Κ1 ) To αποτζλεςμα φαίνεται από τον πίνακα που ακολουκεί. L1 Κ1 001 11500 002 10500 008 1080 009 11080 Διαπιςτϊνουμε ότι θ ενθμζρωςθ ζγινε παίρνοντασ το ςωςτό ποςό από τθν TR1.
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 7 Κεωρείςτε το παρακάτω ςχεςιακό ςχιμα : Student [ sid:integer, name:string, age:integer)] Course [cid:integer, title:string, time:time, room:string, pid:integer ] registered [sid:integer, cid:integer] Professor [pid:integer, name:string, depcode:integer] Για κάκε ζνα από τα παρακάτω transactions, δϊςτε το επίπεδο απομόνωςθσ που κα χρθςιμοποιοφςατε και αιτιολογείςτε τθν επιλογι ςασ. i. Εγγραφι ενόσ φοιτθτι προςδιοριηόμενου από το sid του, ςτο μάκθμα «Introduction to Database Systems». ii. Αλλαγι τθσ εγγραφισ ενόσ φοιτθτι προςδιοριηόμενου από το sid του από ζνα μάκθμα ςε ζνα άλλο. iii. Ανάκεςθ ςε ζνα νζο κακθγθτι προςδιοριηόμενου από το pid του, του μακιματοσ με τουσ λιγότερουσ φοιτθτζσ. iv. Εμφάνιςθ, για κάκε μάκθμα, του αρικμοφ των εγγεγραμμζνων φοιτθτϊν.
ΔΟΣΟΛΘΨΛΕΣ ΡΑΑΔΕΛΓΜΑ 7 Για κάκε ζνα από τα παρακάτω transactions, δϊςτε το επίπεδο απομόνωςθσ που κα χρθςιμοποιοφςατε και αιτιολογείςτε τθν επιλογι ςασ. i.εγγραφι ενόσ φοιτθτι προςδιοριηόμενου από το sid του, ςτο μάκθμα «Introduction to Database Systems». Επειδι ειςάγουμε μια νζα γραμμι ςτον πίνακα registered, δε χρειάηεται να δεςμεφςουμε κάποια από τισ υπάρχουςεσ γραμμζσ. Γι αυτό χρθςιμοποιοφμενα READ UNCOMMITTED. ii. Αλλαγι τθσ εγγραφισ ενόσ φοιτθτι προςδιοριηόμενου από το sid του από ζνα μάκθμα ςε ζνα άλλο. Επειδι κάνουμε update μια υπάρχουςα γραμμι ςτον πίνακα registered, χρειαηόμαςτε εάν αποκλειςτικι δζςμευςθ (exclusive lock) ςτθ γραμμι που ανανεϊνουμε, γιϋ αυτό χρθςιμοποιοφμε READ COMMITTED. iii. Ανάκεςθ ςε ζνα νζο κακθγθτι προςδιοριηόμενου από το pid του, του μακιματοσ με τουσ λιγότερουσ φοιτθτζσ. Για να αποτρζψουμε άλλεσ ςυναλλαγζσ από το να ειςάγουν ι να ανανεϊςουν τον πίνακα registered όςο εμείσ διαβάηουμε από αυτόν (known as the phantom problem), χρειάηεται να χρθςιμοποιιςουμε SERIALIZABLE. iv. Εμφάνιςθ, για κάκε μάκθμα, του αρικμοφ των εγγεγραμμζνων φοιτθτϊν. Ππωσ το iii.
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ Βιμα 1 ο : Χρθςιμοποιοφμε τον πίνακα REGION ςε μια ΒΔ Northwind που δθμιουργοφμε οι ίδιοι (εκτελοφμε το αρχείο northwind.sql που κατεβάηουμε από τον εφδοξο για να ειςάγουμε πίνακεσ ςτθν ΒΔ μασ) Βιμα 2 ο : Για να δοφμε τισ εγγραφζσ του πίνακα Region, πάμε ςε αυτόν, κάνουμε δεξί κλικ κι επιλζγουμε Select top 1000 Rows. Βιμα 3 ο : Εκτελοφμε τα παραδείγματα που ακολουκοφν για κάκε ζνα isolation level.
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ Θ επιλογι του isolation level μπορεί να πραγματοποιθκεί και μζςω τθσ SQL (όπωσ κα δείξουμε ςτα επόμενα παραδείγματα, αλλά και μζςω του περιβάλλοντοσ του SQL Server Management Studio, ωσ εξισ: Δεξί κλικ ςτο άςπρο παράκυρο του query κι επιλζγουμε Query Options. Στο παράκυρο που κα προκφψει από το Advanced κζτουμε το isolation level που κζλουμε. Ραρατθροφμε ότι ο SQL Server ζχει προεπιλεγμζνο το read committed isolation level. ΡΟΣΟΧΘ: πρζπει να είμαςτε πολφ προςεκτικοί με αυτι τθ ρφκμιςθ. Πταν αλλάηουμε τθ ρφκμιςθ, αυτι επθρεάηει μόνο το τρζχον session, γεγονόσ που ςθμαίνει ότι αλλάηει τον τρόπο που πραγματοποιοφνται τα κλειδϊματα όταν τρζχουν τα επερωτιματα ςε αυτό το state, όςο και ςε άλλα. ΕΜΕΛΣ ΑΡΟ ΕΔΩ ΚΛ ΕΞΘΣ ΚΑ ΔΘΛΩΝΟΥΜΕ ΤΟ ISOLATION LEVEL ΜΕΣΩ ΤΘΣ SQL ΚΑΛ ΟΧΛ ΑΡΟ ΤΟ ΡΕΛΒΑΛΛΟΝ ΤΟΥ SQL SERVER.
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ UNCOMMITTED (1/4) READ UNCOMMITTED Επιτρζπει τθν ανάγνωςθ δεδομζνων που δεν ζχουν γίνει COMMIT (uncommitted ι dirty data), δθλαδι κάποιεσ τιμζσ ι εγγραφζσ μπορεί να εμφανιςτοφν ι να εξαφανιςτοφν πριν ολοκλθρωκεί το transaction. Είναι το πιο ελάχιςτα περιοριςτικό από τα τζςςερα isolation levels και παρζχει υψθλό ςυγχρονιςμό, αλλά δθμιουργεί προβλιματα ςυγχρονιςμοφ, όπωσ dirty-reads, lost updates, nonrepeatable reads (Inconsistent analysis) και phantom reads. Δοκιμάηουμε πρϊτα τθν περίπτωςθ που δεν χρθςιμοποιιςουμε τθ read uncommitted. writer begin transaction update Region set RegionDescription = 'East' where RegionId = 1 reader select * from Region ΤΛ ΓΛΝΕΤΑΛ ΛΟΛΡΟΝ ΣΤΘΝ ΡΕΛΡΤΩΣΘ ΡΟΥ Θ ΡΩΤΘ ΔΟΣΟΛΘΨΛΑ ΑΛΛΑΗΕΛ ΜΛΑ ΓΑΜΜΘ ΣΕ ΖΝΑ ΡΛΝΑΚΑ ΚΑΛ ΜΕΤΑ ΜΛΑ ΔΕΥΤΕΘ ΔΟΣΟΛΘΨΛΑ ΡΑΕΛ ΝΑ ΔΛΑΒΑΣΕΛ ΤΘΝ ΕΓΓΑΦΘ ΑΥΤΙ?????? Θ connection2 που εκκινεί τθ δεφτερθ δοςολθψία δεν μπορεί να διαβάςει τα δεδομζνα, επειδι τζκθκε ζνα κλείδωμα για τα δεδομζνα τθσ δοςολθψίασ 1. Με αυτό τον τρόπο, μειϊνεται θ ανακρίβεια των δεδομζνων, αφοφ απαγορεφεται να γίνουν ορατά δεδομζνα που δεν ζχουν γίνει ακόμθ commit.
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ UNCOMMITTED (2/4) READ UNCOMMITTED
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ UNCOMMITTED (3/4) READ UNCOMMITTED (Dirty Data) Επιτρζπει τθν ανάγνωςθ δεδομζνων που δεν ζχουν γίνει COMMIT (uncommitted ι dirty data), δθλαδι κάποιεσ τιμζσ ι εγγραφζσ μπορεί να εμφανιςτοφν ι να εξαφανιςτοφν πριν ολοκλθρωκεί το transaction. Είναι το πιο ελάχιςτα περιοριςτικό από τα τζςςερα isolation levels και παρζχει υψθλό ςυγχρονιςμό, αλλά δθμιουργεί προβλιματα ςυγχρονιςμοφ, όπωσ dirty-reads, lost updates, nonrepeatable reads (Inconsistent analysis) και phantom reads. Αφινουμε τθ connection1 που εκτελεί τθ δοςολθψία 1 ωσ ζχει, δεν τθν ξαναεκτελοφμε και ςτθ δοςολθψία 2 εκτελοφμε το query που αναφζρεται παρακάτω και αφορά τον reader. Λζμε ςτον SQL Server ότι κζλουμε να διαβάςουμε τα δεδομζνα τθσ δοςολθψίασ 1 ακόμθ και αν δεν ζχουν γίνει ακόμθ commit. Αυτό ονομάηεται dirty reading. Φανταςτείτε τισ ςυνζπειεσ όταν θ δοςολθψία 1 κάνει roll back, ενϊ θ δοςολθψία 2 πάρει μια απόφαςθ από το αποτζλεςμα που είχε πριν το roll back. writer reader begin transaction update Region set RegionDescription = 'East' where RegionId = 1 set transaction isolation level read uncommitted select * from Region
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ UNCOMMITTED (4/4) READ UNCOMMITTED
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ COMMITTED (1/4) READ COMMITTED (Default transaction isolation level του SQL Server) Ρροχωρά ςε κλείδωμα κατά τθν ανάγνωςθ δεδομζνων για να αποφφγει τα dirty reads, αλλά τα δεδομζνα μπορεί να αλλάξουν πριν το τζλοσ του transaction, καταλιγοντασ ζτςι ςε non repeatable reads ι phantom data. Είναι δθλαδι δυνατό μια άλλθ ςυναλλαγι να τροποποιιςει μια τιμι που ζχει διαβάςει το transaction, ενϊ αυτό βρίςκεται ςε εξζλιξθ. Επίςθσ, το transaction είναι εκτεκειμζνο ςτο phantom πρόβλθμα. Με το READ COMMITTED isolation level, οι αλλαγζσ ςτα δεδομζνα δεν είναι ορατεσ από άλλεσ δοςολθψίεσ, μζχρι θ ςυγκεκριμζνα δοςολθψία να κάνει commit. Πταν διαβάηει τα δεδομενα, ο SQL Server βάηει ζνα κλείδωμα ςε όλεσ τισ γραμμζσ που διαβάηει και όταν βρεί μια γραμμι που ζχει κλειδωκεί από άλλθ δοςολθψία, το query περιμζνει ζωσ ότου θ δοςολθψία ολοκλθρωκεί και το κλείδωμα ελευκερωκεί. Ουςιαςτικά είναι ότι ακριβϊσ κάναμε ςτο προθγοφμενο παράδειγμα. Αφοφ το default transaction isolation level είναι το read committed, ακόμθ και αν δεν το αναφζρουμε ςτθν αρχι query, ο SQL Server το κεωρεί ωσ δεδομζνο, οπότε δεν μπορεί να ολοκλθρϊςει το διάβαςμα των δεδομζνων από τον reader, αν δε γίνουν commit τα δεδομζνα. writer begin transaction update Region set RegionDescription = 'East' where RegionId = 1 reader select * from Region
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ COMMITTED (2/4) READ COMMITTED (Default transaction isolation level του SQL Server)
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ COMMITTED (3/4) READ COMMITTED (Default transaction isolation level του SQL Server) Για να δθλϊςουμε ότι για να διαβαςτοφν τα δεδομζνα τθσ δοςολθψίασ 1 (writer) πρζπει να γίνουν commit προςκζτουμε εκτελοφμε πάλι τα queries τθσ δοςολθψίασ 1, κζτοντασ το isolation level read committed και κάνοντασ commit transaction. Αφοφ γίνουν commit τα δεδομζνα μποροφμε να εκτελζςουμε τθ δοςολθψία 2 (reader) και να πάρουμε το ςωςτό αποτζλεςμα. writer set transaction isolation level read committed begin transaction update Region set RegionDescription = 'East' where RegionId = 1 select * from Region commit transaction reader set transaction isolation level read committed select * from Region Εφόςον ζχουμε κάνει commit transaction, δεν μποροφμε να εκτελζςουμε το rollback transaction, αφοφ οι αλλαγζσ ζχουν γίνει μόνιμεσ ςτθ ΒΔ. Στθν περίπτωςθ αυτι, κάνουμε δεξί κλικ πάνω ςτον πίνακα, επιλζγουμε Edit top 200 Rows και επαναφζρουμε τθν τιμι ςτο κελί που μεταβλικθκε.
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ READ COMMITTED (4/4) READ COMMITTED
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ REPEATABLE READ (1/6) REPEATABLE READ Επιβάλλει κλείδωμα ςε όλεσ τισ εγγραφζσ (δεδομζνα) που ςυμμετζχουν ςε ζνα query. Σε αντίκεςθ με το Read Committed, δεν αφινει ελεφκερο το κλείδωμα όταν διαβάηεται θ εγγραφι. Αντίκετα, το διατθρεί μζχρι να ολοκλθρωκεί θ δοςολθψία. Ουςιαςτικά λφνει όλα τα προβλιματα (lost updates και nonrepeatable reads), εκτόσ από τα phantom reads. Το επίπεδο REPEATABLE READ εξαςφαλίηει πωσ δεν μποροφν να διαβαςτοφν δεδομζνα που ζχουν μεταβλθκεί, αλλά δεν ζχουν γίνει commit από άλλεσ δοςολθψίεσ. Επίςθσ, εμποδίηει τθ διαδικαςία update ςε δεδομζνα που ζχουν επιλεγεί από άλλεσ δοςολθψίεσ, μζχρι θ δοςολθψία να ολοκλθρωκεί. Στο παράδειγμα μασ δεν κάνουμε commit τθ δοςολθψία ςτον writer και παρατθροφμε ότι το query του reader δεν εκτελείται. writer reader set transaction isolation level repeatable read begin transaction insert into Region values ('5', 'PhantomRow') select * from Region set transaction isolation level repeatable read begin transaction select * from Region
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ REPEATABLE READ (2/6) REPEATABLE READ
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ REPEATABLE READ (3/6) REPEATABLE READ
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ REPEATABLE READ (4/6) REPEATABLE READ Επιβάλλει κλείδωμα ςε όλεσ τισ εγγραφζσ (δεδομζνα) που ςυμμετζχουν ςε ζνα query. Σε αντίκεςθ με το Read Committed, δεν αφινει ελεφκερο το κλείδωμα όταν διαβάηεται θ εγγραφι. Αντίκετα, το διατθρεί μζχρι να ολοκλθρωκεί θ δοςολθψία. Ουςιαςτικά λφνει όλα τα προβλιματα (lost updates και nonrepeatable reads), εκτόσ από τα phantom reads. Το επίπεδο REPEATABLE READ εξαςφαλίηει πωσ δεν μποροφν να διαβαςτοφν δεδομζνα που ζχουν μεταβλθκεί, αλλά δεν ζχουν γίνει commit από άλλεσ δοςολθψίεσ. Επίςθσ, εμποδίηει τθ διαδικαςία update ςε δεδομζνα που ζχουν επιλεγεί από άλλεσ δοςολθψίεσ, μζχρι θ δοςολθψία να ολοκλθρωκεί. Κάνουμε commit τθ δοςολθψία. Στον writer ςβινουμε τθ γραμμι του insert, αφοφ ζχει γίνει ςτο προθγοφμενο βιμα. writer set transaction isolation level repeatable read begin transaction reader set transaction isolation level repeatable read begin transaction select * from Region commit transaction select * from Region commit transaction
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ REPEATABLE READ (5/6) REPEATABLE READ
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ REPEATABLE READ (6/6) REPEATABLE READ
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ SERIALIZABLE (1/5) SERIALIZABLE Είναι το πιο περιοριςτικό isolation level (αποφεφγουμε τα phantom reads). Με αυτό δεν επιτρζπεται πρόςβαςθ ςτα δεδομζνα μιασ δοςολθψίασ, ότι isolation level και να ζχει θ δοςολθψία που το επιχειρεί. Καμία δοςολθψία δεν μπορεί να ειςάγει μια τιμι ςε ζνα πίνακα τθσ πρϊτθσ δοςολθψίασ, γεγονόσ που διαςφαλίηει ότι όλα τα SELECT που κα γίνουν μζςα ςτθ βάςθ κα επιςτρζφουν πάντα τα ίδια αποτελζςματα μζχρι το τζλοσ. Για να ςβιςουμε τθν καινοφρια γραμμι και να προχωριςουμε ςτο επόμενο παράδειγμα μασ, υπάρχουν 2 τρόποι: Δεξί κλικ ςτον πίνακα, επιλογι του Edit top 200 Rows και δεξί κλικ ςτθν γραμμι από αριςτερά και delete Μζςω sql, ανοίγουμε ζνα καινοφριο query και εκτελοφμε το εξισ: delete from Region where RegionID=5 Μζχρι να γίνει commit θ πρϊτθ δοςολθψία, καμία άλλθ δοςολθψία δεν μπορεί να ειςάγει καμία τιμι set transaction isolation level serializable begin transaction select * from Region commit transaction set transaction isolation level serializable begin transaction insert into Region values ('5', 'PhantomRow') select * from Region commit transaction
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ SERIALIZABLE (2/5) SERIALIZABLE
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ SERIALIZABLE (3/5) SERIALIZABLE
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ SERIALIZABLE (4/5) SERIALIZABLE
ΔΟΣΟΛΘΨΛΕΣ - ΡΑΑΔΕΛΓΜΑ SERIALIZABLE (5/5) SERIALIZABLE
ΑΣΚΘΣΘ 1 (1/2) Κεωρείςτε αν πίνακα ταξινόμθςθσ λογαριαςμϊν τραπζηθσ : Key Value john $300 george $600 michael $9000 Ο προγραμματιςτισ υλοποιεί τθν deposit function ωσ εξισ: function deposit(account, amount): currentbalance = bigtable.get(account) currentbalance += amount bigtable.put(account, currentbalance) 1. Βάςει του παραπάνω πίνακα, ο χριςτθσ εκτελεί το deposit( michael, $500). Το πρόγραμμα καταςτρζφεται κάποια ςτιγμι κατά τθ διάρκεια τθσ εκτζλεςθσ. Ροιεσ είναι οι πικανζσ καταςτάςεισ τθσ michael γραμμισ ςτον πίνακα? 2. Βάςει του παραπάνω πίνακα, ο χριςτθσ εκτελεί το deposit( michael, $500). Το πρόγραμμα ολοκλθρϊνεται. Αμζςωσ μετά, πζφτει θ τάςθ ςτο data center, οπότε όλα τα μθχανιματα επανεκκινοφν. Ροιεσ είναι οι πικανζσ καταςτάςεισ τθσ michael γραμμισ ςτον πίνακα, όταν το ςφςτθμα ζχει επανζλκει?
Key Value john $300 george $600 michael $9000 ΑΣΚΘΣΘ 1 (2/2) function deposit(account, amount): currentbalance = bigtable.get(account) currentbalance += amount bigtable.put(account, currentbalance) 1. Βάςει του παραπάνω πίνακα, ο χριςτθσ εκτελεί το deposit( michael, $500). Το πρόγραμμα καταςτρζφεται κάποια ςτιγμι κατά τθ διάρκεια τθσ εκτζλεςθσ. Ροιεσ είναι οι πικανζσ καταςτάςεισ τθσ michael γραμμισ ςτον πίνακα? Η γραμμι μπορεί να ζχει είτε michael = $9000 είτε michael = $9500, ανάλογα με το πότε εμφανίςτθκε πρόβλθμα ςτο ςφςτθμα, πριν ι μετά που ζγραψε το αποτζλεςμα. 2. Βάςει του παραπάνω πίνακα, ο χριςτθσ εκτελεί το deposit( michael, $500). Το πρόγραμμα ολοκλθρϊνεται. Αμζςωσ μετά, πζφτει θ τάςθ ςτο data center, οπότε όλα τα μθχανιματα επανεκκινοφν. Ροιεσ είναι οι πικανζσ καταςτάςεισ τθσ michael γραμμισ ςτον πίνακα, όταν το ςφςτθμα ζχει επανζλκει? Η γραμμι μπορεί να ζχει μονάχα τθν τιμι $9500. όταν το data center επανζλκει, θ εγγραφι κα υπάρχει ςτο log.
ΑΣΚΘΣΘ 2 (1/2) Κεωρείςτε το παρακάτω ςχεςιακό ςχιμα : Student [ sid:integer, name:string, age:integer)] Course [cid:integer, title:string, time:time, room:string, pid:integer ] registered [sid:integer, cid:integer] Professor [pid:integer, name:string, depcode:integer] Για κάκε ζνα από τα παρακάτω transactions, δϊςτε το επίπεδο απομόνωςθσ που κα χρθςιμοποιοφςατε και αιτιολογείςτε τθν επιλογι ςασ. i. Εγγραφι ενόσ φοιτθτι προςδιοριηόμενου από το sid του, ςτο μάκθμα «Database Systems». ii. Αλλαγι τθσ εγγραφισ ενόσ φοιτθτι προςδιοριηόμενου από το sid του από ζνα μάκθμα ςε ζνα άλλο. iii. Ανάκεςθ ςε ζνα νζο κακθγθτι προςδιοριηόμενου από το pid του, του μακιματοσ με τουσ λιγότερουσ φοιτθτζσ. iv. Εμφάνιςθ, για κάκε μάκθμα, του αρικμοφ των εγγεγραμμζνων φοιτθτϊν.
ΑΣΚΘΣΘ 2 (2/2) Student [ sid:integer, name:string, age:integer)] Course [cid:integer, title:string, time:time, room:string, pid:integer ] registered [sid:integer, cid:integer] Professor [pid:integer, name:string, depcode:integer] Για κάκε ζνα από τα παρακάτω transactions, δϊςτε το επίπεδο απομόνωςθσ που κα χρθςιμοποιοφςατε και αιτιολογείςτε τθν επιλογι ςασ. i. Εγγραφι ενόσ φοιτθτι προςδιοριηόμενου από το sid του, ςτο μάκθμα «Database Systems». Επειδι ειςάγουμε μια νζα γραμμι ςτον πίνακα registered, δε χρειάηεται να δεςμεφςουμε κάποια από τισ υπάρχουςεσ γραμμζσ. Γι αυτό χρθςιμοποιοφμενα READ UNCOMMITTED. ii. Αλλαγι τθσ εγγραφισ ενόσ φοιτθτι προςδιοριηόμενου από το sid του από το ζνα μάκθμα ςε ζνα άλλο. Επειδι κάνουμε update μια υπάρχουςα γραμμι ςτον πίνακα registered, χρειαηόμαςτε εάν αποκλειςτικι δζςμευςθ (exclusive lock) ςτθ γραμμι που ανανεϊνουμε, γιϋαυτό χρθςιμοποιοφμε READ COMMITTED. iii. Ανάκεςθ ςε ζνα νζο κακθγθτι προςδιοριηόμενου από το pid του, του μακιματοσ με τουσ λιγότερουσ φοιτθτζσ. Για να αποτρζψουμε άλλεσ ςυναλλαγζσ από το να ειςάγουν ι να ανανεϊςουν τον πίνακα registered όςο εμείσ διαβάηουμε από αυτόν (known as the phantom problem), χρειάηεται να χρθςιμοποιιςουμε SERIALIZABLE. iv. Εμφάνιςθ, για κάκε μάκθμα, του αρικμοφ των εγγεγραμμζνων φοιτθτϊν. Όπωσ και ςτο iii.
ΕΥΧΑΛΣΤΩ ΡΟΛΥ! 59