Η αγορά σου διαβάζει ότι ένα προϊόν κοστίζει 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(); Το ReadCommitted είναι η προεπιλογή του SQL Server. Η ακριβής συμπεριφορά εξαρτάται και από τις ρυθμίσεις της βάσης. Τεκμηρίωση Microsoft
Επιλέγουμε επίπεδο με βάση τον κανόνα που προστατεύουμε. Μεγαλύτερη απομόνωση μπορεί να σημαίνει περισσότερη αναμονή για άλλους χρήστες.
