ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Πανεπιστήμιο Πειραιώς Τμήμα Ψηφιακών Συστημάτων Μανουσόπουλος Χρήστος

Σχετικά έγγραφα
Βάσεις Δεδομένων. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Πανεπιστήμιο Πειραιώς Τμήμα Ψηφιακών Συστημάτων Μανουσόπουλος Χρήστος

Κεφάλαιο 13 Δοσοληψίες

10 η Διάλεξη Python Βάσεις δεδομένων στη python

Έλεγχος Ταυτοχρονισμού

DELETE, UPDATE, INSERT.

DELETE, UPDATE, INSERT

Επεξεργασία οσοληψιών (συνέχεια)

Ηλεκτρονικοί Υπολογιστές II


Δοσοληψίες Βάσεις Δεδομένων Διδάσκων: Μαρία Χαλκίδη

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Πανεπιστήμιο Πειραιώς Τμήμα Ψηφιακών Συστημάτων Μανουσόπουλος Χρήστος

Ηλεκτρονικοί Υπολογιστές II

Διάλεξη 16: SQL DML IV, SQL DCL, SQL TCL. Διδάσκων: Παναγιώτης Ανδρέου

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

Έλεγχος συγχρονικότητας Μέρος 1 Βάσεις Δεδομένων Διδάσκων: Μαρία Χαλκίδη

Βάσεις Δεδομένων ΙΙ. Διάλεξη 1 η Επεξεργασία Δοσοληψιών. Σύστημα Επεξεργασίας Δοσοληψιών

PostgreSQL. Oracle. Εαρινό Εξάμηνο

Ηλεκτρονικοί Υπολογιστές II

Ακεραιότητα και Ασφάλεια Μέρος 1 Σχεδιασμός Βάσεων Δεδομένων

Βάσεις Δεδομένων ΗγλώσσαSQL (Structured Query Language)

Οι εντολές CREATE TABLE, ALTER TABLE, CREATE KEY, ALTER KEY.

Επεξεργασία οσοληψιών

Βάσεις Δεδομένων Η γλώσσα SQL (Structured Query Language) Εισαγωγή στην SQL (2) Ιστορικά Στοιχεία. SQL - Structured Query Language (1)

Έλεγχος συγχρονικότητας Μέρος 2 Βάσεις Δεδομένων Διδάσκων: Μαρία Χαλκίδη

Οι εντολές CREATE TABLE, ALTER TABLE, CREATE KEY, ALTER KEY.

Θεµατολόγιο. Α) Πρακτικά Θέµατα στον Έλεγχο Ταυτοχρονισµού

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ. Επιλέγει όλες τις πλειάδες, από μια σχέση R, που ικανοποιούν τη συνθήκη επιλογής.

ΒΑΣΕΙΣ Ε ΟΜΕΝΩΝ ΙΙ. Επεξεργασία οσοληψιών. το πώς βλέπει το Σ Β τα προγράµµατα των χρηστών. οσοληψία (transaction)

Προχωρημένα Θέματα Βάσεων Δεδομένων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ - ΤΜΗΥΠ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ ΙI

Η SQL ως γλώσσα τροποποίησης Δεδομένων

Τεχνικές Ελέγχου Συνδροµικότητας

Δοσοληψίες. Κατανεμημένα Συστήματα

Τμήμα Διοίκησης Επιχειρήσεων

ΒΑΣΕΙΣ Ε ΟΜΕΝΩΝ ΙΙ. Σχετικά µε το µάθηµα: Αξιολόγηση. Σχετικά µε το µάθηµα:faq ΟΧΙ ΝΑΙ. Λιγότερος! (ας πούµε το 1/3-1/4)

Δοσοληψίες. Κατανεμημένα Συστήματα

Βάσεις Δεδομένων ΙΙ. Διάλεξη 3 η Tεχνικές Aνάκαμψης. Ιδιότητες Δοσοληψιών

Σχεδιασμός Βάσεων Δεδομένων


Διαχείριση Πολιτισμικών Δεδομένων

Διάλεξη 02: Βάσεις Δεδομένων Εισαγωγή. Διδάσκων: Παναγιώτης Ανδρέου

Εξεταστική Περίοδος Ιουνίου 2004

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ.Ε.

Ιατρική Πληροφορική. Δρ. Π. ΑΣΒΕΣΤΑΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΒΙΟΪΑΤΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ Τ. Ε. Χρήσιμοι Σύνδεσμοι

Εργαστήριο Βάσεων Δεδομένων

Ορισμοί Σχεσιακού Μοντέλου και (απλές)τροποποιήσεις Σχέσεων στην SQL. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Διαχείριση Πολιτισμικών Δεδομένων

9η Εργαστηριακή Άσκηση: Stored Procedures - Triggers. Αποθηκευμένες Διαδικασίες (Stored Procedures):

Διαχείριση Δοσοληψιών

Επανάκτηση δεδομένων. (εμπλουτισμένο υλικό)

ΕΣΔ 232: ΟΡΓΑΝΩΣΗ ΔΕΔΟΜΕΝΩΝ ΣΤΗ ΚΟΙΝΩΝΙΑ ΤΗΣ ΠΛΗΡΟΦΟΡΙΑΣ. Ακαδημαϊκό Έτος , Εαρινό Εξάμηνο. Εργαστηριακή Άσκηση 4 7/02/2012


ΘΕΜΑΤΑ. Ερώτηση 1 Κατά τη Φυσική Αποθήκευση (Physical storage) μιας ΒΔ αποθηκεύονται στον δίσκο τα:

ΕΙΣΑΓΩΓΗ ΣΤΑ ΣΥΣΤΗΜΑΤΑ ΔΙΑΧΕΙΡΙΣΗΣ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ - ΤΜΗΥΠ ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Ι

Εργαστήριο Βάσεων Δεδομένων. Εισαγωγικό Φροντιστήριο Βασικές Έννοιες - Ανάλυση Απαιτήσεων

Ορισμοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

ΕΠΛ 342 Βάσεις εδοµένων

DBTechNet. DBTech VET. SQL Transactions. Θεωρία και Ασκήσεις Πρακτικής Εφαρμογής. Στην ελληνική

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

Βάσεις Δεδομένων 2. Φροντιστήριο Δοσοληψίες Τεχνικές ελέγχου συνδρομικότητας. Ημερ: 05/5/2009 Ακ.Έτος

ΦΡΟΝΤΙΣΤΗΡΙΟ ΣΤΗ ΓΛΩΣΣΑ SQL

Transactions Management. (Διαχείριση Δοσοληψιών)

Επαναφορά του Συστήματος (Μέρος Α')

DISTINCT, LIKE, NULL, AND, OR, BETWEEN

Η SQL αποτελείται από δύο υποσύνολα, τη DDL και τη DML.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ.

Τεχνολογία Πολιτισμικού Λογισμικού

Εργαστήριο Βάσεων Δεδομένων. Δικαιώματα Χρηστών Προβολές

Πανεπιστήμιο Πειραιώς, Τμήμα Πληροφορικής

Βάσεις Δεδομένων ΙΙ Ενότητα 1

Αρχεία και Βάσεις Δεδομένων. Εξεταστική Περίοδος Σεπτεμβρίου 2007

Αρχιτεκτονική Συστημάτων Βάσεων Δεδομένων. Κατηγορίες χρηστών ΣΔΒΔ Αρχιτεκτονική ANSI/SPARC Γλώσσες ερωτημάτων Μοντέλα δεδομένων Λειτουργίες ΣΔΒΔ

SQL Data Manipulation Language

Αποκατάσταση συστήματος Βάσεις Δεδομένων

ΗΥ-360 Αρχεία και Βάσεις Δεδομένων Διδάσκων: Δ. Πλεξουσάκης. Φροντιστήριο SQL Examples Ξένου Ρουμπίνη

. Εργαστήριο Βάσεων Δεδομένων. Triggers

ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ. Βάσεις Δεδομένων

Βάσεις Δεδομένων 5η εργαστηριακή άσκηση

ΦΡΟΝΤΙΣΤΗΡΙΟ ΣΤΗ ΓΛΩΣΣΑ SQL

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

ΙΑΧΕΙΡΙΣΗ ΟΣΟΛΗΨΙΩΝ Να θυµηθούµε:

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων

Βάσεις Δεδομένων ΙΙ Ενότητα 2

Σημεία ελέγχου (Checkpoints)

ΗΥ360 Αρχεία και Βάσεις εδοµένων ιδάσκων:. Πλεξουσάκης

H SQL είναι η γλώσσα για όλα τα εμπορικά σχεσιακά συστήματα διαχείρισης βάσεων δεδομένων

MySQL + Γλώσσα Προγραμματισμού. Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1

Άσκηση 1 (15 μονάδες) (Επεκτατός Κατακερματισμός)

5 η Διάλεξη Python - Αρχεία

Βάσεις Δεδομένων (Databases)

Περιεχόμενα. Μέρος Ι Εισαγωγή στα συστήματα βάσεων δεδομένων Πρόλογος... 33

PROJECT ΕΡΓΑΣΤΗΡΙΩΝ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ Ι. Τμήμα Μηχανικών Πληροφορικής Τ.Ε.

Εισαγωγή στην πληροφορική

Τεχνικές Ανάκαµψης. Αtomicity (ατοµικότητα) - είτε όλες οι πράξεις είτε

Βασικές Εντολές SQL. Θεωρία & Εντολές SQL. Γραμμή Εντολών MS-DOS (MySQL)

Ορισμοί Σχεσιακού Μοντέλου και Τροποποιήσεις Σχέσεων σε SQL

ΗΥ360 Αρχεία και Βάσεις εδοµένων ιδάσκων: ημήτρης Πλεξουσάκης

Διάλεξη 07: Σχεσιακό Μοντέλο II (Relational Data Model) Διδάσκων: Παναγιώτης Ανδρέου

Transcript:

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ Πανεπιστήμιο Πειραιώς Τμήμα Ψηφιακών Συστημάτων Μανουσόπουλος Χρήστος cman@unipi.gr

Δοσοληψίες Concurrent Data Access (Ταυτόχρονη Πρόσβαση σε Δεδομένα) Συνήθως πολλοί χρήστες έχουν ταυτόχρονη πρόσβαση σε μια ΒΔ. Τι κερδίζουμε: Καλύτερη διαβίβαση δεδομένων σε μια δοσοληψία καθώς και μικρότερο χρόνο απόκρισης. Καλύτερη χρήση των πηγών (π.χ. τη χρονική στιγμή που μια διαδικασία διαβάζει το δίσκο, κάποια άλλη μπορεί να χρησιμοποιεί τη CPU ή να διαβάζει άλλο δίσκο) Προσοχή! Ταυτόχρονες ενέργειες μπορεί να οδηγήσουν σε σφάλματα.

Concurrent Data Access (προβλήματα που προκύπτουν) Lost Update Problem: το πρώτο update χάθηκε, το δεύτερο γράφει πάνω στο πρώτο. Η ΒΔ είναι σε μία ασυνεπή κατάσταση, αφού επετράπη στη Δοσοληψία Β να έχει πρόσβαση στα ίδια δεδομένα με αυτά της Δοσοληψίας Α πριν αυτή ολοκληρωθεί. Uncommitted Dirty Data Problem: Η Δοσοληψία B τροφοδοτείται με ανολοκλήρωτα δεδομένα από τη Δοσοληψία A (δεν έχουν γίνει ακόμα commit), κάτι που μπορεί να οδηγήσει σε μια λανθασμένη απόφαση. Inconsistent data, non repeatable read, phantom insert problem: Η Δοσοληψία Β εκτελεί το ίδιο υποερώτημα για δεύτερη φορά, αλλά επιστρέφει διαφορετικά αποτελέσματα.

Concurrent Data Access Lost update problem Συμβαίνει όταν μία ή περισσότερες δοσοληψίες προσπαθούν να κάνουν update την ίδια εγγραφή σε μια δεδομένη χρονική στιγμή. Το πρώτο update γράφεται επιτυχώς στη ΒΔ, αλλά κατά λάθος ένα δεύτερο update μιας άλλης δοσοληψίας γράφει πάνω από την προηγουμένη πληροφορία. Π.χ. Ο user A ανακτά μια εγγραφή. Έπειτα ο user B ανακτά την ίδια εγγραφή. ο user B γράφει στη ΒΔ αμέσως το update, πριν ο user A γράψει το δικό του. Ο user A εκτελεί το update του στη ΒΔ και οι αλλαγές που έγιναν από τον user B σιωπηλά έχουν αντικατασταθεί από το update του user A. Ερώτηση: προκύπτει το ίδιο πρόβλημα αν ο user A εκτελέσει πρώτος το update?

Concurrent Data Access Uncommitted Dirty Data Problem Dirty reads: ένα dirty read συμβαίνει όταν μια δοσοληψία διαβάζει δεδομένα τη στιγμή που μια άλλη δοσοληψία κάνει κάποιο update που δεν έχει γίνει ακόμα commit. Dirty data: είναι δεδομένα που τροποποιήθηκαν από μια δοσοληψία που δεν είχε ακόμα ολοκληρωθεί. Π.χ. Ο user A παραγγέλνει 150 κομμάτια από ένα προϊόν που στην αποθήκη υπάρχουν 300 κομμάτια. Η αποθήκη γίνεται updated στα 150 κομμάτια χωρίς να έχει ολοκληρωθεί (commit) η παραγγελία. Ο user B θέλει να παραγγείλει 200 κομμάτια από το ίδιο προϊόν. Τσεκάρει την αποθήκη και βρίσκει ότι δεν υπάρχουν αρκετά κομμάτια για τη παραγγελία του και σταματά τη διαδικασία. O user A ακυρώνει τη παραγγελία και οι αλλαγές γίνονται rollback. Ο user Β έχει διαβάσει δεδομένα (dirty read) που θεωρείται ότι ποτέ δεν υπήρξαν.

Concurrent Data Access non repeatable read / phantom insert problem Non-repeatable reads: ένα non-repeatable read συμβαίνει όταν μια δοσοληψία διαβάζει την ίδια γραμμή δύο φορές, αλλά παίρνει διαφορετικά δεδομένα / αποτελέσματα κάθε φορά (Update ή Delete της γραμμής) Π.χ. Η δοσοληψία Α διαβάζει μια γραμμή. Η δοσοληψία Β ενημερώνει ή διαγράφει αυτή τη γραμμή και κάνει commit. Η δοσοληψία Α ξαναδιαβάζει τη γραμμή και βρίσκει άλλη τιμή ή ότι έχει διαγραφεί η γραμμή. Phantom: ενα phantom είναι μια γραμμή που ταιριάζει με τα κριτήρια αναζήτησης, αλλά δεν είναι αρχικά ορατή. Συμβαίνει όταν εκτελούνται δύο όμοια queries και οι εγγραφές που επιστρέφονται από το δεύτερο query είναι διαφορετικές από αυτές του πρώτου (εισαγωγή νέας γραμμής που πληροί κριτήρια). Π.χ. Η δοσοληψία A εκτελεί ένα ερώτημα για να βρεί συνολικό αριθμό παραγγελιών. Η δοσοληψία B εκτελεί την παραγγελία ορισμένων προϊόντων. Εισάγονται παραγγελίες στον πίνακα των παραγγελιών. Η δοσοληψία A εκτελεί το ίδιο ερώτημα και βρίσκει διαφορετικό αριθμό παραγγελιών.

Επίπεδα απομόνωσης (isolation levels) Το επίπεδο απομόνωσης ορίζει τον βαθμό που μια δοσοληψία απομονώνεται από τις αλλαγές στα δεδομένα που γίνονται από άλλες δοσοληψίες. Τα επίπεδα απομόνωσης περιγράφονται με βάση τις συνέπειες της ταυτόχρονης πρόσβασης στα δεδομένα, όπως dirty reads ή phantom reads, που επιτρέπονται. Κάθε ΣΔΒΔ υλοποιεί τις δοσοληψίες με το δικό του τρόπο. Ταυτόχρονες δοσοληψίες μπορούν να εκτελούνται σε διαφορετικά επίπεδα απομόνωσης. Τα inserts, updates, και deletes συμπεριφέρονται πάντα το ίδιο όποιο επίπεδο απομόνωσης και να έχουμε, μόνο με τα select statements ποικίλλει το αποτέλεσμα.

Επίπεδα απομόνωσης (isolation levels) Τα επίπεδα απομόνωσης ελέγχουν τα παρακάτω: Αν γίνονται κλειδώματα όταν διαβάζονται δεδομένα και τι είδους κλειδώματα απαιτούνται. Πόσο διαρκούν τα κλειδώματα. Εάν μια ενέργεια ανάγνωσης σε γραμμές που τροποποιούνται από άλλη δοσοληψία: Μπλοκαριστεί εωσότου το αποκλειστικό κλείδωμα ελευθερωθεί. Ανακτήσει την commited έκδοση της γραμμής που υπήρχε τη στιγμή που ξεκίνησε η δοσοληψία. Διαβάσει την uncommitted τροποποίηση των δεδομένων. Μια δοσοληψία πάντα παίρνει ένα κλείδωμα σε δεδομένα που τροποποιεί και το κρατάει εωσότου ολοκληρωθεί, ανεξάρτητα από το επίπεδο απομόνωσης της δοσοληψίας.

Επίπεδα απομόνωσης (isolation levels) Σύνταξη στον SQL Server SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED READ COMMITTED REPEATABLE READ SNAPSHOT SERIALIZABLE } O παρακάτω πίνακας δείχνει τις συνέπειες της ταυτόχρονης πρόσβασης στα δεδομένα όπως ορίζονται από τα διαφορετικά επίπεδα απομόνωσης. Isolation level Dirty read Nonrepeatable read Phantom Read uncommitted Yes Yes Yes Read committed No Yes Yes Repeatable read No No Yes Snapshot No No No Serializable No No No

Επίπεδα απομόνωσης (isolation levels) Read Committed (ανάγνωση επικυρωμένων) Το select ερώτημα μιας δοσοληψίας θα επιστρέψει μόνο επικυρωμένα δεδομένα (committed). Εάν μια δοσοληψία τροποποιήσει δεδομένα σε έναν πίνακα, σε άλλες δοσοληψίες με Read Committed επίπεδο απομόνωσης το select ερώτημα στον ίδιο πίνακα θα περιμένει εωσότου κλείσει η δοσοληψία. Είναι δυνατό μια άλλη δοσοληψία να τροποποιήσει τα δεδομένα που έχει διαβάσει αρχικά η Read Committed δοσοληψία. Αν ολοκληρωθεί η πρώτη δοσοληψία και η δεύτερη διαβάσει εκ νέου τα δεδομένα θα καταλήξει σε non repeatable reads ή phantom data. Read Committed είναι το προεπιλεγμένο επίπεδο απομόνωσης.

Επίπεδα απομόνωσης (isolation levels) Read Uncommitted (ανάγνωση Μη επικυρωμένων) Επιτρέπει την ανάγνωση μη επικυρωμένων δεδομένων. Ουσιαστικά επιτρέπει σε μια δοσοληψία να βλέπει ενδιάμεσα αποτελέσματα άλλων δοσοληψιών, πριν αυτές ολοκληρωθούν. Εάν τα δεδομένα ενός πίνακα τροποποιούνται (insert,update ή delete) σε μια δοσοληψία που δεν έχει ολοκληρωθεί (committ ή rollback) τότε σε ερωτήματα αναζήτησης στο πίνακα σε δοσοληψίες "Read Uncommitted θα εμφανιστούν dirty-read δεδομένα εφόσον η αρχική δοσοληψία κάνει rollback. Δεν υπάρχει καμία καθυστέρηση κατά της εκτέλεση των ερωτημάτων. Είναι το λιγότερο περιοριστικό από τα isolation levels, διαβεβαιώνει μόνο ότι κατεστραμμένα δεδομένα δεν μπορούν να διαβαστούν.

Επίπεδα απομόνωσης (isolation levels) Repeatable Read (επαναλήψιμη ανάγνωση) Τα δεδομένα που επιστρέφονται από ερώτημα δοσοληψίας αυτού του επιπέδου απομόνωσης δεν μπορούν να τροποποιηθούν από άλλες δοσοληψίες έως ότου ολοκληρωθεί η δοσοληψία. Ωστόσο αυτό το επίπεδο απομόνωσης επιτρέπει την εισαγωγή καινούργιων δεδομένων. Ως αποτέλεσμα μπορεί να έχουμε phantom εγγραφές. Επιβάλλει κλείδωμα σε όλες τις εγγραφές που συμμετέχουν σε ένα query. Ουσιαστικά λύνει το πρόβλημα των dirty reads και non repeatable reads.

Επίπεδα απομόνωσης (isolation levels) Serializable Είναι παρόμοια με την απομόνωση Repeatable Read με τη διαφορά ότι αποτρέπει το phantom πρόβλημα. Αυτό επιτυγχάνεται με κλείδωμα εύρους τιμών. Εάν ο πίνακας έχει ευρετήριο τότε το ΣΔΒΔ κλειδώνει τις εγγραφές βάση του εύρους τιμών που χρησιμοποιούνται στην where πρόταση (πχ where ID between 1 and 3). Εάν δεν υπάρχει ευρετήριο κλειδώνεται ολόκληρος ο πίνακας.

Επίπεδα απομόνωσης (isolation levels) Snapshot (Στιγμιότυπο) Η απομόνωση Snapshot είναι παρόμοια με την απομόνωση Serializable. Η διαφορά είναι πως το Snapshot δεν κλειδώνει τον πίνακα κατά τη διάρκεια της δοσοληψίας. Έτσι ο πίνακας μπορεί να τροποποιηθεί σε άλλες δοσοληψίες. Η απομόνωση Snapshot διατηρεί στη Tempdb εκδόσεις παλαιότερων δεδομένων για την περίπτωση τροποποιήσεων που συμβαίνουν σε άλλες δοσοληψίες. Τότε στη δοσοληψία με απομόνωση Snapshot θα εμφανιστούν τα παλαιότερα δεδομένα από την Tempdb. Δοσοληψίες SNAPSHOT που διαβάζουν δεδομένα δεν μπλοκάρουν άλλες συναλλαγές στο να εγγράψουν δεδομένα και το αντίστροφο.

Επίπεδα απομόνωσης Χρήση, πλεονεκτήματα, μειονεκτήματα Read Committed θετικά: καλή ισορροπία μεταξύ ταυτοχρονισμού (concurrency) και συνέπειας (consistency). Αρνητικά: τα δεδομένα μπορούν να αλλάξουν όταν προσπελαύνονται πολλές φορές μέσα στην ίδια δοσοληψία. Χρήση: πολύ συχνό isolation level. Είναι το προεπιλεγμένο isolation level του SQL Server. Read Uncommitted θετικά: δεν χρειάζονται κλειδώματα διαβάσματος. Αρνητικά: τα δεδομένα δε διασφαλίζεται ότι θα είναι συνεπή. Χρήση: χρησιμοποιείται σε queries/applications, όπου η ασυνέπεια των δεδομένων δεν πρόκειται να είναι μεγάλο πλήγμα.

Επίπεδα απομόνωσης Χρήση, πλεονεκτήματα, μειονεκτήματα Repeatable Read θετικά: καλύτερη συνέπεια των δεδομένων. Αρνητικά: τα κλειδώματα διατηρούνται για όλη τη διάρκεια της δοσοληψίας, γεγονός που μπορεί να μειώσει τον ταυτοχρονισμό (concurrency). Δεν προστατεύει από τις phantom γραμμές. Χρήση: δεν είναι πολύ συχνό. Serializable θετικά: πλήρη συνέπεια των δεδομένων. Αρνητικά: τα κλειδώματα διατηρούνται για όλη τη διάρκεια της δοσοληψίας, γεγονός που μπορεί να μειώσει τον ταυτοχρονισμό (concurrency). Χρήση: χρησιμοποιείται στις περιπτώσεις που η συνέπεια των δεδομένων είναι απαραίτητη προϋπόθεση.

Επίπεδα απομόνωσης - Κλειδώματα Σε έλεγχο ταυτόχρονης πρόσβασης με βάση τα κλειδώματα, τα επίπεδα απομόνωσης καθορίζουν τη διάρκεια του κλειδώματος. "C" - Σημαίνει ότι τα κλειδώματα παραμένουν μέχρι την ολοκλήρωση της δοσοληψίας. "S" - Σημαίνει ότι τα κλειδώματα παραμένουν μόνο κατά τη διάρκεια της εντολής που εκτελείται. Isolation level Write Operation Read Operation Read Uncommitted S S S Read Committed C S S Repeatable Read C C S Serializable C C C Range Operation (...where...)

Αδιέξοδο - DEADLOCK Το αδιέξοδο συμβαίνει όταν δυο (ή περισσότερες) δοσοληψίες μπλοκάρουν μόνιμα η μια την άλλη. Αυτό συμβαίνει όταν κάθε δοσοληψία έχει ένα κλείδωμα σε μια πηγή (πλειάδα, γραμμή) που η άλλη δοσοληψία προσπαθεί να αποκτήσει πρόσβαση και να κλειδώσει. Η T1 κλειδώνει την R1 και ζητά πρόσβαση και κλείδωμα στην R2. Η T2 κλειδώνει την R2 και ζητά πρόσβαση και κλείδωμα στην R. Καμιά δοσοληψία δεν μπορεί να προχωρήσει έως ότου μια πηγή είναι διαθέσιμη και καμία πηγή δε μπορεί να απελευθερωθεί μέχρι να προχωρήσει κάποια δοσοληψία. Ο SQL αυτόματα εντοπίζει τα αδιέξοδα. Επιλέγει κάποια δοσοληψία ως θύμα και την τερματίζει με μήνυμα λάθους για να αρθεί το αδιέξοδο.

Παραδείγματα Isolation Levels Read Uncommitted; BEGIN TRAN UPDATE employees SET salary = 57600 WHERE employee_number = 1002 Σε ένα άλλο session ξεκινάμε τη δοσοληψία SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SET NOCOUNT ON GO WHERE employee_number = 1002 Θα εμφανιστεί η uncommitted έκδοση του μισθού του υπαλλήλου. Με rollback; Ή commit; Ολοκληρώνουμε τη πρώτη δοσοληψία

Παραδείγματα Isolation Levels Read Committed (1); BEGIN TRAN UPDATE employees SET salary = 57600 WHERE employee_number = 1002 waitfor delay '00:00:10' commit; (ή rollback;) Σε ένα άλλο session ξεκινάμε τη δοσοληψία SET TRANSACTION ISOLATION LEVEL READ COMMITTED SET NOCOUNT ON GO WHERE employee_number = 1002 Τι παρατηρούμε? O SQL server ξεκινά το πρώτο transaction και εκτελεί εντολή UPDATE. Αμέσως μετά ξεκινά το δεύτερο transaction και περιμένει να ολοκληρωθεί το πρώτο transaction για να διαβάσει την committed έκδοση των δεδομένων.

Παραδείγματα Isolation Levels Read Committed (2); BEGIN TRAN waitfor delay '00:00:10' UPDATE employees SET salary = 57600 WHERE employee_number = 1002 commit; (ή rollback;) Σε ένα άλλο session ξεκινάμε τη δοσοληψία SET TRANSACTION ISOLATION LEVEL READ COMMITTED SET NOCOUNT ON GO WHERE employee_number = 1002 Tι παρατηρούμε? Η δεύτερη δοσοληψία τρέχει αμέσως διότι δεν υπάρχει κλείδωμα στον πίνακα employees και εμφανίζει την committed έκδοση των δεδομένων.

Παραδείγματα Isolation Levels REPEATABLE READ (1); SET TRANSACTION ISOLATION LEVEL REPEATABLE READ SET NOCOUNT ON GO BEGIN TRAN WHERE employee_number = 1002 WAITFOR DELAY '00:00:10' WHERE employee_number = 1002 rollback; Σε ένα άλλο session ξεκινάμε τη δοσοληψία BEGIN TRAN UPDATE employees SET salary = 70000 WHERE employee_number = 1002 commit; Tι παρατηρούμε? O SQL Server κλειδώνει το πίνακα employees αμέσως μετά το πρώτο SELECT στη πρώτη δοσοληψία. Το update της δεύτερης δοσοληψίας δεν γίνεται commit έως ότου ολοκληρωθεί η πρώτη δοσοληψία. Τρέχουμε τη πρώτη δοσοληψία με ISOLATION LEVEL READ COMMITTED Ποιο πρόβλημα εμφανίζεται? Εμφανίζεται το πρόβλημα του non-repeatable read. Στη πρώτη δοσοληψία το παρόμοιο SELECT ερώτημα παράγει διαφορετικά αποτελέσματα γιατί μεσολάβησε το UPDATE της δεύτερης δοσοληψίας.

Παραδείγματα Isolation Levels REPEATABLE READ (2); SET TRANSACTION ISOLATION LEVEL REPEATABLE READ SET NOCOUNT ON GO BEGIN TRAN WHERE employee_number in (1001,1002) WAITFOR DELAY '00:00:10' WHERE employee_number in (1001,1002) rollback; Σε ένα άλλο session εκτελούμε την εντολή BEGIN TRAN UPDATE employees SET salary = 60000 WHERE employee_number = 1003 commit; Tι παρατηρούμε? H δεύτερη δοσοληψία εκτελείται χωρίς καθυστέρηση διότι ο SQL server κλειδώνει τις εγγραφές που επιστρέφονται από το select της πρώτης δοσοληψίας και δεν περιλαμβάνονται σε αυτές η γραμμή που τροποποιεί η δεύτερη δοσοληψία.

Παραδείγματα Isolation Levels REPEATABLE READ (3); SET TRANSACTION ISOLATION LEVEL REPEATABLE READ SET NOCOUNT ON GO BEGIN TRAN WAITFOR DELAY '00:00:10' rollback; Σε ένα άλλο session εκτελούμε την εντολή INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES(1005, 'Manousopoulos', 'Chris', 150000, 501) Tι παρατηρούμε? Εμφανίζεται μια Phantom γραμμή στο SELECT της πρώτης δοσοληψίας διότι ο SQL server επιτρέπει την εισαγωγή γραμμής στο πίνακα employees.

Παραδείγματα Isolation Levels REPEATABLE READ (4); SET TRANSACTION ISOLATION LEVEL REPEATABLE READ SET NOCOUNT ON GO WHERE dept_id = 500 WAITFOR DELAY '00:00:10' WHERE dept_id = 500 rollback; Σε ένα άλλο session εκτελούμε την εντολή BEGIN TRAN UPDATE employees SET dept_id = 500 WHERE employee_number = 1003 commit; Tι παρατηρούμε? Η δεύτερη δοσοληψία χωρίς καθυστέρηση τροποποιεί μια γραμμή που αρχικώς δεν ταιριάζει στα κριτήρια του SELECT της πρώτης δοσοληψίας (γι αυτό και δεν είναι κλειδωμένη από τον SQL server). Μετά το commit όμως η συγκεκριμένη γραμμή εμφανίζεται στο result set του SELECT της πρώτης δοσοληψίας γιατί πλέον πληροί τα κριτήριά του ερωτήματος. Πρόβλημα phantom data.

Παραδείγματα Isolation Levels SERIALIZABLE (1); SET TRANSACTION ISOLATION LEVEL SERIALIZABLE SET NOCOUNT ON GO BEGIN TRAN WAITFOR DELAY '00:00:10' rollback; Σε ένα άλλο session εκτελούμε την εντολή INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES(1005, 'Manousopoulos', 'Chris', 150000, 501) Tι παρατηρούμε? Ο SQL server κλειδώνει τον πίνακα employees και για την περίπτωση της εισαγωγής μιας νέας εγγραφής. Η δεύτερη δοσοληψία εκτελείται μόνο όταν ολοκληρωθεί η πρώτη.

Παραδείγματα Isolation Levels SERIALIZABLE (2); SET TRANSACTION ISOLATION LEVEL SERIALIZABLE SET NOCOUNT ON GO BEGIN TRAN WHERE employee_number between 1001 and 1003 WAITFOR DELAY '00:00:10' WHERE employee_number between 1001 and 1003 rollback; Σε ένα άλλο session εκτελούμε την εντολή INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES(1005, 'Manousopoulos', 'Chris', 150000, 501) Tι παρατηρούμε? Η δεύτερη δοσοληψία εκτελείται χωρίς καθυστέρηση διότι ο sql server κλειδώνει συγκεκριμένο εύρος τιμών (βάση των κριτηρίων του SELECT στη πρώτη δοσοληψία) στον πίνακα employees χρησιμοποιώντας το ευρετήριο του πίνακα.

Παραδείγματα Isolation Levels SERIALIZABLE (3); SET TRANSACTION ISOLATION LEVEL SERIALIZABLE SET NOCOUNT ON GO BEGIN TRAN FROM indextesting WHERE column1 between 195 and 199 WAITFOR DELAY '00:00:10' FROM indextesting WHERE column1 between 195 and 199 rollback; Σε ένα άλλο session εκτελούμε την εντολή INSERT INTO indextesting (column1, column2) VALUES(205, 58000) Tι παρατηρούμε? Η δεύτερη δοσοληψία εκτελείται όταν ολοκληρωθεί η πρώτη. Αυτό συμβαίνει διότι ο sql server κλειδώνει όλον τον πίνακα indextesting διότι δεν υπάρχει ευρετήριο του πίνακα.

Παραδείγματα Isolation Levels SNAPSHOT ; SET TRANSACTION ISOLATION LEVEL SNAPSHOT SET NOCOUNT ON GO BEGIN TRAN WAITFOR DELAY '00:00:10' rollback; Σε ένα άλλο session εκτελούμε την εντολή BEGIN TRAN INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES(1005, 'Manousopoulos', 'Chris', 150000, 501) UPDATE employees SET salary = 60000 WHERE employee_number = 1003 commit; Tι παρατηρούμε? Η δεύτερη δοσοληψία εκτελείται χωρίς καθυστέρηση διότι δεν κλειδώνονται αντικείμενα που εμπλέκονται στα ερωτήματα της πρώτης. Ωστόσο η πρώτη δοσοληψία εμφανίζει έκδοση committed δεδομένων που διατηρούνται στην tempdb και όχι τα committed δεδομένα που προκύπτουν από την παράλληλη εκτέλεση της δεύτερης δοσοληψίας. ALTER DATABASE tutorial_db SET ALLOW_SNAPSHOT_ISOLATION ON για να ενεργοποιηθεί το επίπεδο απομόνωσης Snapshot στη Β.Δ.

Παραδείγματα Isolation Levels Για να βρίσκουμε τα κλειδώματα χρησιμοποιούμε το παρακάτω sql ερώτημα: SELECT es.login_name, tl.resource_type, tl.resource_associated_entity_id, tl.request_mode, tl.request_status FROM sys.dm_tran_locks tl INNER JOIN sys.dm_exec_sessions es ON tl.request_session_id = es.session_id WHERE es.login_name = SUSER_SNAME() AND tl.resource_associated_entity_id <> 0