DEV Community

nikosst
nikosst

Posted on Edited on

Isolation levels με απλά παραδείγματα

Η αγορά σου διαβάζει ότι ένα προϊόν κοστίζει 100€.

Πριν ολοκληρωθεί, ένας διαχειριστής προσπαθεί να αλλάξει την τιμή σε 120€.

Χρειαζόμαστε για το τι επιτρέπεται να διαβάσει η αγορά και πότε κάποια εργασία πρέπει να περιμένει.

Αυτούς τους κανόνες επιλέγουμε μέσω του επιπέδου απομόνωσης — isolation level.

Τα παρακάτω αφορούν SQL Server.

Οι βασικές επιλογές

ReadCommitted

Διαβάζουμε αλλαγές άλλων συναλλαγών μόνο αφού οριστικοποιηθούν, δηλαδή αφού γίνει commit.

Παράδειγμα: διαβάζουμε 100€, ο διαχειριστής αλλάζει την τιμή και κάνει commit, ξαναδιαβάζουμε 120€.

Είναι συνηθισμένη αφετηρία για καθημερινές εργασίες.

ReadUncommitted

Μπορούμε να διαβάσουμε αλλαγές πριν οριστικοποιηθούν.

Παράδειγμα: βλέπουμε προσωρινή τιμή 80€, αλλά ο διαχειριστής ακυρώνει την αλλαγή με rollback. Η τιμή παραμένει 100€.

Χρησιμοποιείται μόνο όταν αποδεχόμαστε συνειδητά τέτοια ασυνεπή αποτελέσματα.

RepeatableRead

Προστατεύονται οι υπάρχουσες γραμμές που διαβάσαμε.

Παράδειγμα: διαβάζουμε τιμή 100€. Άλλη συναλλαγή που θέλει να την αλλάξει περιμένει μέχρι να ολοκληρωθούμε.

Χρησιμεύει όταν διαδοχικά βήματα πρέπει να βασίζονται στις ίδιες γραμμές. Δεν εμποδίζει όμως κάθε νέα εγγραφή που ταιριάζει στην αναζήτησή μας.

Serializable

Προστατεύεται και το σύνολο της αναζήτησης.

Παράδειγμα: μετράμε 29 συμμετέχοντες σε μάθημα με όριο 30 και προσθέτουμε έναν. Θέλουμε η ταυτόχρονη εκτέλεση της ίδιας διαδικασίας να μην οδηγήσει σε 31.

Προσφέρει ισχυρή προστασία, αλλά μπορεί να προκαλέσει περισσότερη αναμονή.

Snapshot

Διαβάζουμε μια σταθερή αρχική εικόνα των δεδομένων, μαζί με τις δικές μας αλλαγές.

Παράδειγμα: διαβάζουμε 100€, άλλος αλλάζει την τιμή σε 120€ και κάνει commit, αλλά εμείς εξακολουθούμε να βλέπουμε 100€.

Χρησιμεύει σε αναφορές με πολλές αναζητήσεις που πρέπει να συμφωνούν χρονικά. Χρειάζεται ενεργοποίηση στη βάση και μπορεί να εμφανίσει συγκρούσεις όταν ενημερώνουμε δεδομένα. Τεκμηρίωση Microsoft

Επιλογή στον κώδικα

await using var transaction =
    await db.Database.BeginTransactionAsync(
        System.Data.IsolationLevel.ReadCommitted);

// Αναγνώσεις και αλλαγές στη βάση.

await transaction.CommitAsync();
Enter fullscreen mode Exit fullscreen mode

Το ReadCommitted είναι η προεπιλογή του SQL Server. Η ακριβής συμπεριφορά εξαρτάται και από τις ρυθμίσεις της βάσης. Τεκμηρίωση Microsoft

Επιλέγουμε επίπεδο με βάση τον κανόνα που προστατεύουμε. Μεγαλύτερη απομόνωση μπορεί να σημαίνει περισσότερη αναμονή για άλλους χρήστες.


nikosstit@gmail.com

Top comments (0)