ACID

Στην πληροφορική, το ACID (ατομικότητα, συνέπεια, απομόνωση, μονιμότητα) είναι ένα σύνολο ιδιοτήτων το οποίο εγγυάται ότι οι συναλλαγές στην βάση δεδομένων (ΒΔ) λειτουργούν αξιόπιστα. Η ιδέα του ACID είναι να αξιολογεί την δομή βάσεων δεδομένων και εφαρμογών. Όσον αφορά τις βάσεις δεδομένων μια λογική ενέργεια που έχει να κάνει με τα δεδομένα της αποκαλείται συναλλαγή. Για παράδειγμα μια μεταφορά κεφαλαίου από ένα λογαριασμό μιας τράπεζας σε έναν άλλο, αν και μπορεί να συμπεριλαμβάνει πολλές ενέργειες που αφορούν την κίνηση του λογαριασμού, είναι μια συναλλαγή. Ο Jim Gray όρισε αυτές τις ιδιότητες ενός συστήματος αξιόπιστων συναλλαγών στα τέλη του 1970 και ανάπτυξε τεχνολογίες που να το επιτυγχάνουν. Το 1983 ο Andreas Reuter και ο Theo Haerder χρησιμοποίησαν το ακρωνύμιο ACID για να περιγράψουν αυτές τις ιδιότητες.

 Η Ατομικότητα απαιτεί η τροποποίηση που θα γίνει στην ΒΔ να τηρεί τον κανόνα όλα ή τίποτα. Κάθε συναλλαγή η οποία είναι ατομική ονομάζεται έτσι επειδή αν ένα μέρος της αποτύχει, αποτυγχάνει όλη η συναλλαγή και η ΒΔ μένει όπως ήταν πριν εκτελεστεί η συναλλαγή. Είναι πολύ κρίσιμο το ΣΔΒΔ να διατηρεί την ατομικότητα κάθε συναλλαγής ανεξάρτητα από το είδος της εφαρμογής, του ΣΔΒΔ, του λειτουργικού συστήματος ή αστοχίες του υλικού. Μια ατομική συναλλαγή δεν μπορεί να υποδιαιρεθεί, και πρέπει να επεξεργάζεται ολόκληρη ή καθόλου. Η Ατομικότητα σημαίνει ότι οι χρήστες είναι απαλλαγμένοι από τον φόβο μη ολοκληρωμένων συναλλαγών. Οι συναλλαγές μπορούν να αποτύχουν για πολλούς και διάφορους λόγους: Αποτυχία Υλικού: Ένας δίσκος μπορεί να χαλάσει, αποτρέποντας μερικές αλλαγές στη ΒΔ από το να πραγματοποιηθούν. Αποτυχία Συστήματος: Ο χρήστης μπορεί να χάσει την σύνδεση του με το σύστημα πριν ολοκληρώσει τις εργασίες του. Αποτυχία ΒΔ: Η μνήμη της ΒΔ τελειώνει και δεν μπορεί να καταχωρήσει άλλα δεδομένα. Αποτυχία Εφαρμογής: Η εφαρμογή η οποία χειρίζεται την βάση δεδομένων προσπαθεί να βάλει δεδομένα τα οποία παραβιάζουν τους κανόνες που έχει επιβάλλει η ΒΔ, π.χ. απόπειρα δημιουργίας νέου λογαριασμού χωρίς αριθμό λογαριασμού. Η ιδιότητα της Συνέπειας διασφαλίζει ότι η ΒΔ διατηρείται σε μια συνεπή κατάσταση, συγκεκριμένα λέει ότι κάθε συναλλαγή θα οδηγεί την βάση δεδομένων από την μια συνεπή κατάσταση στη άλλη. Η ιδιότητα της συνέπειας δεν λέει πως ένα ΣΔΒΔ πρέπει να χειρίζεται μια ασυνέπεια αλλά λέει πώς να είναι καθαρή η ΒΔ στο τέλος μιας συναλλαγής. Αν για κάποιο λόγο μια συναλλαγή παραβιάζει την συνέπεια της ΒΔ όλη η συναλλαγή ακυρώνεται (επανέρχεται στην κατάσταση πριν εκτελεστεί η συναλλαγή) ή το ΣΔΒΔ κάνει μερικές ενέργειες για να είναι η ΒΔ και πάλι συνεπής. Έτσι αν ένα σχήμα ΒΔ λέει πως ένα πεδίο είναι μόνο για ακέραιους αριθμούς τότε το ΣΔΒΔ μπορεί είτε να απορρίψει απόπειρες για είσοδο δεκαδικών αριθμών είτε να τους στρογγυλοποιήσει. Και οι δυο αυτές ενέργειες διατηρούν την συνέπεια. Ο κανόνας συνέπειας ισχύει μόνο σε κανόνες ακεραιότητας οι οποίοι είναι εντός της εμβέλειας του αντικειμένου. Έτσι, αν ένα ΣΔΒΔ επιτρέπει σε κάποια πεδία να είναι αναφορές για άλλη εγγραφή τότε η συνέπεια προϋποθέτει ότι το ΣΔΒΔ πρέπει να ενισχύσει την περιφερειακή ακεραιότητα(referential integrity) (περιφερειακή ακεραιότητα: είναι μια ιδιότητα δεδομένων η οποία όταν ισχύει απαιτεί κάθε τιμή από ένα χαρακτηριστικό (στήλη στην ΒΔ) μιας σχέσης (πίνακας) να υπάρχει σαν τιμή κάποιου άλλου χαρακτηριστικού σε μια διαφορετική (ή ίδια) σχέση.) Όταν τελειώσει οποιαδήποτε συναλλαγή οποιαδήποτε αναφορά στην ΒΔ πρέπει να είναι έγκυρη και να ισχύει. Αν μια συναλλαγή αποπειραθεί να διαγράψει μια εγγραφή η οποία αναφέρεται από κάπου αλλού τότε ένας από τους ακόλουθους μηχανισμούς θα διατηρήσουν την συνέπεια: Η συναλλαγή να ακυρωθεί (abort) και να γυρίσει η ΒΔ στην προηγούμενη συνεπή κατάσταση. Να διαγράφουν όλα τα αρχεία τα οποία ανέφεραν αυτή τη διαγραμμένη εγγραφή (το οποίο είναι γνωστό σαν cascade delete) Να μηδενίσει (τιμές null) όλα τα σχετικά πεδία σε όλες τις εγγραφές οι οποίες είχαν σχέση με την διαγραμμένη εγγραφή.Αυτά είναι παραδείγματα Διάδοσης Περιορισμών, μερικά συστήματα ΒΔ επιτρέπουν στους σχεδιαστές της βάσης να καθορίζουν ποιες επιλογές πρέπει να υπάρχουν όταν δημιουργείται ένα σχήμα για μια ΒΔ. Οι δημιουργοί εφαρμογών είναι υπεύθυνοι για διατήρηση τις συνέπειας όσο αφορά τις εφαρμογές τους, επιπλέον από τους προσφερόμενους κανόνες του ΣΔΒΔ. Έτσι, αν ένας χρήστης κάνει μια ανάληψη κεφαλαίου και το νέο υπόλοιπο είναι χαμηλότερο από το επιτρεπόμενο όριο τότε όσο αφορά ο ΣΔΒΔ η βάση είναι σε συνεπή κατάσταση αν και ο κανόνας που το ελέγχει αυτό έχει παραβιαστεί. Η Απομόνωση αναφέρεται στην απαίτηση ότι όλες οι ενέργειες δεν μπορούν να έχουν πρόσβαση ή να δουν δεδομένα τα οποία τροποποιούνται εκείνη την στιγμή από μια συναλλαγή η οποία δεν έχει ακόμα ολοκληρωθεί. Κάθε συναλλαγή δεν πρέπει να ξέρει αν υπάρχουν άλλες συναλλαγές που εκτελούνται ταυτόχρονα, αλλά να περιμένουν την ολοκλήρωση μιας συναλλαγής ώστε να δουν/τροποποιήσουν τα δεδομένα τα οποία χρειάζεται και η άλλη συναλλαγή. Η Μονιμότητα εγγυάται στον χρήστη του ΣΔΒΔ ότι αν τελειώσει μια συναλλαγή επιτυχώς τότε τα αποτελέσματα της δεν θα χαθούν. Οι αλλαγές που έχει κάνει η συναλλαγή δεν θα χαθούν έστω και να κρασάρει το σύστημα και ότι όλες οι προϋποθέσεις ακεραιότητας ισχύουν, έτσι ώστε το ΣΔΒΔ δεν θα χρειαστεί αν ακυρώσει αυτή τη συναλλαγή. Πολλά ΣΔΒΔ επιτυγχάνουν μονιμότητα με το να τηρούν ένα αρχείο συναλλαγών (log) το οποίο μπορεί να χρησιμοποιηθεί και να επαναφέρει την κατάσταση του συστήματος ακριβώς όπως ήταν πριν το κρασάρισμα. Μια συναλλαγή αποκαλείται commit μόνο όταν καταχωρηθεί σε αυτό το αρχείο. Η Μονιμότητα δεν προϋποθέτει μόνιμη κατάσταση της ΒΔ. Μια υποδεέστερη συναλλαγή μπορεί να αλλάξει δεδομένα τα οποία έχουν αλλαχτεί από μια κυριότερη συναλλαγή χωρίς να υπάρχει παραβίαση της αρχής της μονιμότητας. Τα παρακάτω παραδείγματα χρησιμοποιούνται για περαιτέρω επεξήγηση των ιδιοτήτων του ACID. Σε αυτά τα παραδείγματα η ΒΔ έχει δυο αντικείμενα τα Α, Β και δύο εγγραφές. Ένας περιορισμός ακεραιότητας απαιτεί ότι η τιμή στο Α και η τιμή στο Β πρέπει να έχουν άθροισμα 100. Η συναλλαγή αφαιρει 10 από το Α και προσθέτει 10 στο Β. Αν επιτύχει θα είναι έγκυρη επειδή τα δεδομένα συνεχίζουν να ικανοποιούν τον περιορισμό. Αλλά αν υποθέσουμε ότι αφού αφαιρέσουμε 10 από το Α η συναλλαγή δεν είναι ικανή να τροποποιήσει το Β. Αν η ΒΔ διατηρήσει την νέα τιμή της Α τότε η ατομικότητα και ο περιορισμός έχουν παραβιαστεί. Η Ατομικότητα απαιτεί ότι και τα δυο μέρη της συναλλαγής θα ολοκληρωθούν ή κανένα. Η συνέπεια είναι ένας πολύ γενικός Όρος ο οποίος απαιτεί ότι τα δεδομένα ικανοποιούν όλους τους κανόνες εγκυρότητας τους οποίους έχει η εφαρμογή αλλά για να ικανοποιηθεί η ιδιότητα της συνέπειας το σύστημα ΒΔ πρέπει μόνο να προσέξει τους κανόνες που είναι στην εμβέλεια του. Στο προηγούμενο παράδειγμα ένας κανόνας ήταν η απαίτηση Α+Β=100, τα περισσότερα συστήματα ΒΔ δεν θα επιτρέπουν αυτόν τον κανόνα να καθοριστεί και δεν θα είχαν καμία υποχρέωση να τον προσέξουν – αλλά θα ήταν ικανά να εγγυηθούν ότι οι τιμές θα ήταν ακέραιοι αριθμοί. Ένα παράδειγμα κανόνων που μπορεί να προσέξει ένα σύστημα ΒΔ είναι οι τιμές των πρωτευόντων κλειδιών μια εγγραφής οι οποίες ταυτοποιούν αυτή την εγγραφή, της οποίας οι τιμές αποθηκεύονται στα πεδία είναι του σωστού τύπου και της σωστής εμβέλειας (το σχήμα μπορεί να απαιτεί ότι το Α και το Β είναι ακέραιοι) και τα ξένα κλειδιά είναι όλα έγκυρα. Οι κανόνες εγκυρότητας που δεν μπορούν να επιβλεφτούν από το σύστημα ΒΔ είναι ευθύνη των εφαρμογών που χρησιμοποιούν την ΒΔ. Για να εξηγήσουμε την απομόνωση υποθέτουμε ότι δυο συναλλαγές εκτελούνται την ίδια ώρα και προσπαθούν τροποποιήσουν τα ίδια δεδομένα. Μια εκ των δυο πρέπει να περιμένει τελειώσει η άλλη για διατήρηση της απομόνωσης. Υποθέτουμε δύο συναλλαγές. Η Τ1 μεταφέρει 10 από το Α στο Β. Η Τ2 μεταφέρει 10 από το Β στο Α. Συνδυασμένα είναι τέσσερις ενέργειες: αφαιρώ 10 από το Α προσθέτω 10 στο Β αφαιρώ 10 από το Β προσθέτω 10 στο ΑΑν αυτές οι ενέργειες γίνουν σειριακά τότε υπάρχει απομόνωση αν και η Τ2 πρέπει να περιμένει. Υποθέτουμε ότι η Τ1 αποτυγχάνει στην μέση. Η ΒΔ αναιρεί τα αποτελέσματα της Τ1 και η Τ2 βλέπει μόνο έγκυρα δεδομένα. Αν περιπλέξουμε τις συναλλαγές η ακριβής σειρά των ενεργειών μπορεί να είναι:Α-10 , Β-10, Β+10, Α+10.Θα δούμε τι θα γίνει αν η Τ1 αποτύχει. Η Τ1 αφαιρει 10 από το Α. Αυτή τη στιγμή η Τ2 προσθέτει 10 στο Α επαναφέροντας το στην αρχική του τιμή. Αυτή την στιγμή η Τ1 έχει αποτύχει. Ποια πρέπει να είναι η τιμή του Α? Η Τ2 όχι ήδη αλλάξει την τιμή της Α. Επίσης η Τ1 δεν άλλαξε ποτέ την τιμή της Β. Η Τ2 αφαιρει 10 από την Β. Αν η Τ2 ολοκληρωθεί τότε η τιμή του Β θα είναι κατά 10 λιγότερη και η τιμή του Α θα είναι η ίδια αφήνοντας μας με μια μη έγκυρη ΒΔ. Αυτό ονομάζεται και αποτυχία write-write επειδή και οι δυο συναλλαγές επιχείρησαν να γράψουν στο ίδιο πεδίο. Υποθέτουμε ότι μια συναλλαγή μεταφέρει 10 από το Α στο Β. Αφαιρει 10 από το Α. Μετά προσθέτει 10 στο Β. Σε αυτό το σημείο στέλνεται μια αναφορά επιτυχίας στο χρήστη ότι η συναλλαγή ολοκληρώθηκε. Παρόλα αυτά οι αλλαγές είναι ακόμα μέσα στην μνήμη περιμένοντας να γραφτούν μόνιμα στο δίσκο. Κόβεται το ρεύμα και οι αλλαγές χάνονται. Ο χρήστης υποθέτει ότι οι αλλαγές έγιναν ενώ στην πραγματικότητα οι αλλαγές χάθηκαν. Για να ικανοποιηθεί ο περιορισμός της Μονιμότητας το σύστημα ΒΔ πρέπει να εξασφαλίσει ότι το μήνυμα αναφοράς παραδίδεται όταν η συναλλαγή ολοκληρωθεί. Μπορεί να είναι αρκετό για το σύστημα η τήρηση ενός αρχείου συναλλαγών (log) το οποίο σε περίπτωση κρασαρίσματος θα επαναφέρει το σύστημα στη μορφή που ήταν λίγο πριν το κρασάρισμα. Μια συναλλαγή για να πραγματοποιηθεί χρειάζεται μια ακολουθία ενεργειών η οποία μπορεί να αποτύχει για πολλούς λόγους. Για παράδειγμα, το σύστημα μπορεί να μην έχει άλλο χώρο στον δίσκο ή μπορεί να έχει τελειώσει ο χρόνος CPU. Υπάρχουν δυο πολύ δημοφιλής τεχνικές: write ahead logging και shadow paging (παρέχουν ατομικότητα και μονιμότητα στα συστήματα ΒΔ). Και στις δυο περιπτώσεις, χρειάζονται κλειδώματα σε όλες τις πληροφορίες οι οποίες αναβαθμίζονται και εξαρτούνται από την απομόνωση, πιθανότατα επίσης πάνω σε όλα τα δεδομένα που γίνονται read. Στο write ahead logging η ατομικότητα εξασφαλίζεται αντιγράφοντας τα αυθεντικά δεδομένα σε ένα αρχείο πριν αλλάξει την ΒΔ. Αυτό επιτρέπει στη ΒΔ να επιστρέψει σε μια συνεπή κατάσταση ακόμα και στην περίπτωση κρασαρίσματος. Στο shadow paging, οι αναβαθμίσεις ισχύουν σε ένα αντίγραφο στην βάση δεδομένων και ενεργοποιούνται μόλις η συναλλαγή γίνει commit. Οι περισσότερες Βάσεις ΒΔ βασίζονται στα κλειδώματα για να παρέχουν τις ιδιότητες ACID. Το κλείδωμα σημαίνει ότι η συναλλαγή μαρκάρει τα δεδομένα πριν τα χρησιμοποιήσει έτσι ώστε το ΣΔΒΔ να μην επιτρέπει σε άλλες συναλλαγές να το τροποποιήσουν μέχρις ότου η συναλλαγή αυτή τελειώσει μαζί τους (με τα δεδομένα). Το κλείδωμα πρέπει πάντα να αποκτάται πριν την επεξεργασία των δεδομένων ακόμη και δεδομένα τα οποία διαβάζονται μόνο. Επουσιώδης συναλλαγές απαιτούν ένα μεγάλο αριθμό κλειδωμάτων το οποίο οδηγεί σε σημαντική χρήση πόρων και μπλοκάρισμα άλλων συναλλαγών. Για παράδειγμα, αν ο χρήστης Α τρέχει μια συναλλαγή η οποία πρέπει να διαβάσει μια σειρά δεδομένων τότε ο χρήστης Β πρέπει να περιμένει μέχρι να τελειώσει η συναλλαγή του Α. Συχνά εφαρμόζεται κλείδωμα δυο φάσεων για να εγγυηθεί πλήρης απομόνωση. Μια εναλλακτική λύση κλειδώματος είναι ο έλεγχος ταυτοχρονισμού multiversion με τον οποίο η ΒΔ παρέχει σε κάθε συναλλαγή read προτεραιότητα και μη τροποποιημένη έκδοση των δεδομένων, τα οποία τροποποιούνται από άλλη ενεργή συναλλαγή που θέλει να τα τροποποιήσει. Αυτό επιτρέπει στις συναλλαγές που θέλουν να κάνουν read να το κάνουν χωρίς κλείδωμα. Για παράδειγμα, οι write συναλλαγές δεν μπλοκάρουν τις read συναλλαγές και οι συναλλαγές read δεν μπλοκάρουν τις συναλλαγές write. Πηγαίνοντας στο προηγούμενο παράδειγμα όταν η συναλλαγή του χρήστη Α απαιτήσει δεδομένα τα οποία τροποποιεί εκείνη την στιγμή η συναλλαγή του Β τότε η ΒΔ παρέχει στον Α τα δεδομένα τα οποία υπήρχαν πριν η συναλλαγή του χρήστη Β αρχίσει την τροποποίηση. Ο χρήστης Α έχει μια συνεπή όψη της ΒΔ ακόμα και αν άλλη χρήστες την τροποποιούν. Για μια τέτοια υλοποίηση δεν είναι τόσο αυστηρή η ιδιότητα της απομόνωσης, η οποία ονομάζεται snapshot isolation. Εξασφαλίζοντας τις ιδιότητες ACID σε μια κατανεμημένη συναλλαγή σε μια κατανεμημένη ΒΔ όπου δεν υπάρχει ένας κόμβος για όλα τα δεδομένα μια συναλλαγή παρουσιάζει πολλές επιπλοκές. Το δίκτυο μπορεί να αποσυνδεθεί ή ένας κόμβος να ολοκληρωθεί επιτυχώς και μετά να πρέπει να επιστρέψει στην προηγούμενη κατάσταση επειδή απέτυχε ένας άλλος κόμβος. Το πρωτόκολλο two-phase commit (2PC) (το οποίο είναι διαφορετικό από το πρωτόκολλο κλειδώματος δύο φάσεων) παρέχει ατομικότητα για κατανεμημένες συναλλαγές ώστε να εξασφαλίσει ότι κάθε μέρος της συναλλαγής να συμφωνεί αν η συναλλαγή πρέπει να γίνει commit ή abort. Συνοπτικά, στην πρώτη φάση ένας κόμβος (ο συντονιστής) διερευνά τους άλλους κόμβους και μόνο όταν απαντήσουν ότι είναι έτοιμοι επικυρώνει την συναλλαγή στη δεύτερη φάση. Gray, Jim, and Reuter, Andreas, Distributed Transaction Processing: Concepts and Techniques. Morgan Kaufmann, 1993. ISBN 1-55860-190-2.