Τι είναι τα isolation levels και πως μπορούν να επηρεάσουν μία συναλλαγή

Τι είναι τα isolation levels και πως μπορούν να επηρεάσουν μία συναλλαγή
Τι είναι τα isolation levels και πως μπορούν να επηρεάσουν μία συναλλαγή

Σε αυτό το άρθρο θα μιλήσουμε για μια εκ των ιδιοτήτων ACID των RDBMS και πιο συγκεκριμένα για την ιδιότητα του Isolation.

Κατά τη διάρκεια συναλλαγών στις σχεσιακές βάσεις δεδομένων, πολλοί χρήστες θα προσπαθήσουν να προσπελάσουν τα ίδια δεδομένα την ίδια ώρα.

Σε αυτό το σημείο παίζει τον ρόλο του το isolation level.

Τι είναι το isolation level

Αναλόγως του επιπέδου του απομόνωσης ή αλλιώς isolation level αλλάζουν οι επιπτώσεις της ταυτόχρονης προσπελάσεις.

Όσο χαμηλότερου επιπέδου είναι το isolation μπορούν περισσότεροι χρήστες να προσπελάσουν τα δεδομένα, αλλά με κάποιες επιπτώσεις όπως το φαινόμενο των dirty reads, non-repeatable reads και phantom reads.

Όσο μεγαλύτερο είναι το επίπεδο του isolation, εξαφανίζονται αυτά τα φαινόμενα, αυξάνοντας όμως τη πιθανότητα σε blocking στα αντικείμενα που έχουν προσπέλαση από πολλούς χρήστες ταυτόχρονα.

Πριν συνεχίσουμε θα πρέπει να γνωρίζουμε τι είναι τα locks και blocks

To lock είναι ένα κλείδωμα σε κομμάτι δεδομένων, ώστε να διασφαλιστεί ότι αναλόγως του isolation level δεν θα έχει δυνατότητα μια άλλη συναλλαγή να προσπελάσει αυτά τα δεδομένα.

Το block συμβαίνει όταν δύο ή παραπάνω συναλλαγές προσπαθούν να προσπελάσουν τα ίδια δεδομένα. Οπότε η πρώτη συναλλαγή δημιουργεί ένα lock στα δεδομένα και η δεύτερη περιμένει να ολοκληρωθεί η συναλλαγή της πρώτης και πάει λέγοντας.

Τι είναι τα isolation levels και πως μπορούν να επηρεάσουν μία συναλλαγή

Τι είναι τα dirty reads, phantom reads, non-repeatable reads  και που εμφανίζονται

Dirty reads

Τα dirty reads συμβαίνουν όταν επιτρέπετε σε μία συναλλαγή να διαβάζει δεδομένα, ενώ σε αυτά είναι σε εξέλιξη μια άλλη συναλλαγή η οποία τα τροποποιεί.

Ένα απλό παράδειγμα που μπορούμε να σκεφτούμε είναι μια συναλλαγή που αλλάζει μια τιμή από 20 σε 21 χωρίς να έχει ολοκληρωθεί (να έχει γίνει commit). Μία δεύτερη συναλλαγή διαβάζει το πεδίο αυτό. Τότε λόγο αυτού του φαινομένου η δεύτερη θα διαβάζει τη τιμή 21 ενώ είναι uncommitted.

Τι είναι τα isolation levels και πως μπορούν να επηρεάσουν μία συναλλαγή
Το παράδειγμα προέρχεται από το wikipedia

Non-repeatable reads

Τα non-repeatable reads συμβαίνουν όταν μια εγγραφή διαβάζεται πάνω από μια φορά σε μια συναλλαγή αλλά η τιμή που επιστρέφεται διαφέρει στην κάθε ανάγνωση της.

Για παράδειγμα διαβάζουμε ένα πεδίο που έχει την τιμή 20 με τη πρώτη συναλλαγή, ενώ έπειτα μια δεύτερη συναλλαγή αλλάζει τη τιμή της σε 21 και κάνει commit ολοκληρώνοντάς τη. Έτσι αν ξαναδιαβάσουμε τη τιμή στην πρώτη συναλλαγή θα έχει γίνει η τιμή της 21.

Τι είναι τα isolation levels και πως μπορούν να επηρεάσουν μία συναλλαγή
Το παράδειγμα προέρχεται από το wikipedia

Phantom reads

Τα phantom reads συμβαίνουν όταν κατά τη διάρκεια μιας συναλλαγής, μια δεύτερη συναλλαγή προσπαθεί να προσθέσει ή αφαιρέσει εγγραφές. Ως αποτέλεσμα αν η πρώτη συναλλαγή ξαναδιαβάσει τα δεδομένα, θα επιστραφεί διαφορετικός αριθμός εγγραφών από τη προηγούμενη φορά.

Για παράδειγμά με μια συναλλαγή διαβάζουμε ένα πίνακα που επιστρέφει 3 εγγραφές και σε μια δεύτερη συναλλαγή εισάγουμε μια εγγραφή στον πίνακα. Σε αυτή την περίπτωση όταν τον ξαναδιαβάσουμε με την πρώτη συναλλαγή θα έχουμε 4 εγγραφές στον πίνακα αυτή την φορά.

Τι είναι τα isolation levels και πως μπορούν να επηρεάσουν μία συναλλαγή
Το παράδειγμα προέρχεται από το wikipedia

Πάμε να δούμε τη λίστα από τα ISO SQL standard isolation levels

Serializable

Serializable είναι το πιο ισχυρό isolation level. Δημιουργεί κλειδώματα(locks) σε όλες τις εγγραφές του κατά την ανάγνωση και την εγγραφή  έως το τέλος της συναλλαγής (δηλαδή να γίνει commit).

Με τη χρήση του αποφεύγονται τα phantom reads, καθώς και όποιο άλλο φαινόμενο μικρότερου isolation level όπως dirty reads και non-repeatable reads.

Repeatable-Read

Το repeatable-Read δημιουργεί κλειδώματα(locks) σε επιλεγμένες εγγραφές κατά την ανάγνωση και την εγγραφή  έως το τέλος της συναλλαγής (δηλαδή να γίνει commit).

Σε αντίθεση με το serializable με τη χρήση τους επιτρέπονται τα phantom reads αλλά εξακολουθούν να αποφεύγονται dirty reads και non-repeatable reads.

Read committed

Το read committed δημιουργεί κλειδώματα (locks) σε επιλεγμένες εγγραφές κατά την εγγραφή έως το τέλος της συναλλαγής, αλλά στην ανάγνωση το κλείδωμα άρετε με το που τελειώσει η ανάγνωση από τη συναλλαγή.

Αυτό έχει ως αποτέλεσμα να υπάρχει η δυνατότητα να συμβούν εκτός από phantom reads και non-repeatable reads, αφού επιτρέπετε να μεταβληθεί η τιμή μετά τη πρώτη ανάγνωση.

Read uncommitted

Το read uncommitted είναι το πιο αδύναμο isolation level. Σε αυτό το επίπεδο επιτρέπονται εκτός από τα phantom reads, non-repeatable read και τα dirty reads.

Οπότε μια συναλλαγή μπορεί να διαβάσει δεδομένα που μπορεί να μεταβάλλονται από μια δεύτερη συναλλαγή, χωρίς να έχει ολοκληρωθεί (να έχει γίνει commit).

Nolock query hint

Κλείνοντας θα πρέπει να επισημανθεί ότι χρησιμοποιώντας query hints μπορούμε να παρακάμψουμε το isolation level που έχει οριστεί. Ένα από τα πιο χρησιμοποιούμενα είναι το with (nolock).

Μας επιτρέπει να προσπελάσουμε τα δεδομένα που θέλουμε αγνοώντας το lock που μπορεί να υπάρχει από άλλη συναλλαγή.

Όπως συμβαίνει και με το read uncommitted isolation level.

Mε αυτή την συμπεριφορά μπορούμε να έχουμε phantom reads, non-repeatable reads και dirty reads.

Μοιράσου το

Αφήστε μία απάντηση