Προβλήματα στην εναλλασσόμενη εκτέλεση συναλλαγών στη σχεδίαση βάσεων δεδομένων

Το DBMS επιδιώκει να βελτιώσει τις επιδόσεις του συστήματος , δηλαδή να αυξήσει την απόδοση επεξεργασίας ή τον χρόνο απόκρισης για σύντομες συναλλαγές. Αυτό επιτυγχάνεται με ταυτόχρονη εκτέλεση των συναλλαγών το οποίο παρόλο που μπορεί να καταργήσει την ιδιότητα της απομόνωσης των συναλλαγών έχει σαν πλεονέκτημα την υψηλή απόδοση του συστήματος. Με την παράλληλη εκτέλεση συναλλαγών επιτυγχάνεται μείωση του χρόνου αδράνειας των δίσκων και της CPU με αποτέλεσμα την αύξηση της απόδοσης επεξεργασίας του συστήματος. Επιπλέον βελτιώνεται και ο χρόνος απόκρισης του συστήματος και ο μέσος χρόνος ολοκλήρωσης μιας συναλλαγής. Όμως μεταξύ συναλλαγών υπάρχουν πολλές φόρες συγκρούσεις. Οι συγκρούσεις αυτές μπορούν να καταστήσουν τη βάση ασυνεπή παρόλο που εάν αυτές οι συναλλαγές εκτελούνταν χωριστά θα υπήρχε συνέπεια. Δύο συναλλαγές συγκρούονται αν έστω μία από αυτές περιέχει ενέργειες εγγραφής. Τρία είναι τα προβλήματα που μπορούν να προκύψουν. 

1. Ασυνεπείς αναγνώσεις (dirty reads)

Ασυνεπή ανάγνωση μπορεί να προκύψει όταν μία συναλλαγή Τ2 μπορεί να διαβάσει ένα στοιχείο της βάσης που έχει τροποποιηθεί από μία άλλη συναλλαγή Τ1 η οποία όμως δεν έχει ακόμα τελειώσει. Στην προκειμένη περίπτωση έχουμε σύγκρουση μεταξύ write-read ενεργειών.

Με ένα παράδειγμα θα δώσουμε μία περίπτωση ασυνεπούς ανάγνωσης.
 
•Έστω Τ1 συναλλαγή που μεταφέρει 500€ από το λογαριασμό Α στο Β. 

•Έστω Τ2 συναλλαγή που αυξάνει τους λογαριασμούς Α και Β κατά 10%.

Έστω ότι η συναλλαγή Τ1 αρχικά αφαιρεί από το λογαριασμό Α 500€, στη συνέχεια η συναλλαγή Τ2 αυξάνει κατά 10% τους Α και Β, και τέλος η συναλλαγή Τ1 προσθέτει στο λογαριασμό Β  500€.Το αποτέλεσμα αυτού του χρονοπρογράμματος είναι διαφορετικό από το αν οι δύο συναλλαγές εκτελούνταν η μία μετά την άλλη. Αυτό συμβαίνει γιατί η συναλλαγή Τ2 διαβάζει δεδομένα πριν ολοκληρωθεί η συναλλαγή Τ1.

2. Μη επαναλαμβανόμενες αναγνώσεις (non-repeatable reads)

Μη επαναλαμβανόμενες αναγνώσεις  έχουμε όταν μία συναλλαγή Τ2 αλλάζει την τιμή ενός αντικειμένου το οποίο έχει διαβαστεί από μία συναλλαγή Τ1 όταν η Τ1 ήταν ακόμα ενεργή. Αν η Τ1 προσπαθήσει να ξαναδιαβάσει την τιμή του αντικειμένου θα πάρει μία διαφορετική τιμή παρόλο που η ίδια δεν το έχει αλλάξει. Στην προκείμενη περίπτωση έχουμε σύγκρουση μεταξύ read-write ενεργειών. 

3. Απώλειες ενημερώσεων(lost updates)

Απώλεια ενημέρωσης μπορεί να προκύψει όταν μία συναλλαγή Τ2 μπορεί να επανεγγράψει την τιμή ενός αντικειμένου, ενώ αυτή έχει ήδη τροποποιηθεί από μία συναλλαγή Τ1 που είναι ακόμα ενεργή.  Στην προκειμένη περίπτωση έχουμε σύγκρουση μεταξύ δύο write ενεργειών.

•Έστω η συναλλαγή Τ1 αφαιρεί 500€ από το λογαριασμό Α.
•Έστω η συναλλαγή Τ2 αυξάνει το λογαριασμό Α κατά 10%.
•Η αρχική τιμή του λογαριασμού Α είναι 1500.

Έστω αρχικά ότι η συναλλαγή Τ1 διαβάζει το Α με σκοπό να αφαιρέσει 500€ από αυτό, συγχρόνως όμως η συναλλαγή Τ2 διαβάζει το Α πριν η Τ1 ολοκληρώσει την ενέργεια εγγραφής  με αποτέλεσμα η Τ2 να αυξάνει κατά 10% το αρχικό Α=1500 και όχι το Α=1000.
Επεξεργασία συναλλαγών