ACID

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

Απομόνωση (Isolation)

Η Απομόνωση αναφέρεται στην απαίτηση ότι όλες οι ενέργειες δεν μπορούν να έχουν πρόσβαση ή να δουν δεδομένα τα οποία τροποποιούνται εκείνη την στιγμή από μια συναλλαγή η οποία δεν έχει ακόμα ολοκληρωθεί. Κάθε συναλλαγή δεν πρέπει να ξέρει αν υπάρχουν άλλες συναλλαγές που εκτελούνται ταυτόχρονα, αλλά να περιμένουν την ολοκλήρωση μιας συναλλαγής ώστε να δουν/τροποποιήσουν τα δεδομένα τα οποία χρειάζεται και η άλλη συναλλαγή.

Μονιμότητα (Durability)

Η Μονιμότητα εγγυάται στον χρήστη του ΣΔΒΔ ότι αν τελειώσει μια συναλλαγή επιτυχώς τότε τα αποτελέσματα της δεν θα χαθούν. Οι αλλαγές που έχει κάνει η συναλλαγή δεν θα χαθούν έστω και να κρασάρει το σύστημα και ότι όλες οι προϋποθέσεις ακεραιότητας ισχύουν, έτσι ώστε το ΣΔΒΔ δεν θα χρειαστεί αν ακυρώσει αυτή τη συναλλαγή. Πολλά ΣΔΒΔ επιτυγχάνουν μονιμότητα με το να τηρούν ένα αρχείο συναλλαγών (log) το οποίο μπορεί να χρησιμοποιηθεί και να επαναφέρει την κατάσταση του συστήματος ακριβώς όπως ήταν πριν το κρασάρισμα. Μια συναλλαγή αποκαλείται commit μόνο όταν καταχωρηθεί σε αυτό το αρχείο.
Η Μονιμότητα δεν προϋποθέτει μόνιμη κατάσταση της ΒΔ. Μια υποδεέστερη συναλλαγή μπορεί να αλλάξει δεδομένα τα οποία έχουν αλλαχτεί από μια κυριότερη συναλλαγή χωρίς να υπάρχει παραβίαση της αρχής της μονιμότητας.

Παραδείγματα

Τα παρακάτω παραδείγματα χρησιμοποιούνται για περαιτέρω επεξήγηση των ιδιοτήτων του ACID. Σε αυτά τα παραδείγματα η ΒΔ έχει δυο αντικείμενα τα Α, Β και δύο εγγραφές. Ένας περιορισμός ακεραιότητας απαιτεί ότι η τιμή στο Α και η τιμή στο Β πρέπει να έχουν άθροισμα 100.

Αποτυχία Ατομικότητας

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

Αποτυχία Συνέπειας

Η συνέπεια είναι ένας πολύ γενικός Όρος ο οποίος απαιτεί ότι τα δεδομένα ικανοποιούν όλους τους κανόνες εγκυρότητας τους οποίους έχει η εφαρμογή αλλά για να ικανοποιηθεί η ιδιότητα της συνέπειας το σύστημα ΒΔ πρέπει μόνο να προσέξει τους κανόνες που είναι στην εμβέλεια του. Στο προηγούμενο παράδειγμα ένας κανόνας ήταν η απαίτηση Α+Β=100, τα περισσότερα συστήματα ΒΔ δεν θα επιτρέπουν αυτόν τον κανόνα να καθοριστεί και δεν θα είχαν καμία υποχρέωση να τον προσέξουν – αλλά θα ήταν ικανά να εγγυηθούν ότι οι τιμές θα ήταν ακέραιοι αριθμοί.  Ένα παράδειγμα κανόνων που μπορεί να προσέξει ένα σύστημα ΒΔ είναι οι τιμές των πρωτευόντων κλειδιών μια εγγραφής οι οποίες ταυτοποιούν αυτή την εγγραφή, της οποίας οι τιμές αποθηκεύονται στα πεδία είναι του σωστού τύπου και της σωστής εμβέλειας (το σχήμα μπορεί να απαιτεί ότι το Α και το Β είναι ακέραιοι) και τα ξένα κλειδιά είναι όλα έγκυρα.
Οι κανόνες εγκυρότητας που δεν μπορούν να επιβλεφτούν από το σύστημα ΒΔ είναι ευθύνη των εφαρμογών που χρησιμοποιούν την ΒΔ.

Αποτυχία Μονιμότητας

Υποθέτουμε ότι μια συναλλαγή μεταφέρει 10 από το Α στο Β. Αφαιρει 10 από το Α. Μετά προσθέτει 10 στο Β. Σε αυτό το σημείο στέλνεται μια αναφορά επιτυχίας στο χρήστη ότι η συναλλαγή ολοκληρώθηκε. Παρόλα αυτά οι αλλαγές είναι ακόμα μέσα στην μνήμη περιμένοντας να γραφτούν μόνιμα στο δίσκο. Κόβεται το ρεύμα και οι αλλαγές χάνονται. Ο χρήστης υποθέτει ότι οι αλλαγές έγιναν ενώ στην πραγματικότητα οι αλλαγές χάθηκαν.
Για να ικανοποιηθεί ο περιορισμός της Μονιμότητας το σύστημα ΒΔ πρέπει να εξασφαλίσει ότι το μήνυμα αναφοράς παραδίδεται όταν η συναλλαγή ολοκληρωθεί. Μπορεί να είναι αρκετό για το σύστημα η τήρηση ενός αρχείου συναλλαγών (log) το οποίο σε περίπτωση κρασαρίσματος θα επαναφέρει το σύστημα στη μορφή που ήταν λίγο πριν το κρασάρισμα.

Υλοποίηση

Μια συναλλαγή για να πραγματοποιηθεί χρειάζεται μια ακολουθία ενεργειών η οποία μπορεί να αποτύχει για πολλούς λόγους. Για παράδειγμα, το σύστημα μπορεί να μην έχει άλλο χώρο στον δίσκο ή μπορεί να έχει τελειώσει ο χρόνος CPU.
Υπάρχουν δυο πολύ δημοφιλής τεχνικές: write ahead logging και shadow paging (παρέχουν ατομικότητα και μονιμότητα στα συστήματα ΒΔ). Και στις δυο περιπτώσεις, χρειάζονται κλειδώματα σε όλες τις πληροφορίες οι οποίες αναβαθμίζονται και εξαρτούνται από την απομόνωση, πιθανότατα επίσης πάνω σε όλα τα δεδομένα που γίνονται read. Στο write ahead logging η ατομικότητα εξασφαλίζεται αντιγράφοντας τα αυθεντικά δεδομένα σε ένα αρχείο πριν αλλάξει την ΒΔ. Αυτό επιτρέπει στη ΒΔ να επιστρέψει σε μια συνεπή κατάσταση ακόμα και στην περίπτωση κρασαρίσματος.
Στο shadow paging, οι αναβαθμίσεις ισχύουν σε ένα αντίγραφο στην βάση δεδομένων και ενεργοποιούνται μόλις η συναλλαγή γίνει commit.

Κλείδωμα VS Multiversioning

Οι περισσότερες Βάσεις ΒΔ βασίζονται στα κλειδώματα για να παρέχουν τις ιδιότητες ACID. Το κλείδωμα σημαίνει ότι η συναλλαγή μαρκάρει τα δεδομένα πριν τα χρησιμοποιήσει έτσι ώστε το ΣΔΒΔ να μην επιτρέπει σε άλλες συναλλαγές να το τροποποιήσουν μέχρις ότου η συναλλαγή αυτή τελειώσει μαζί τους (με τα δεδομένα). Το κλείδωμα πρέπει πάντα να αποκτάται πριν την επεξεργασία των δεδομένων ακόμη και δεδομένα τα οποία διαβάζονται μόνο. Επουσιώδης συναλλαγές απαιτούν ένα μεγάλο αριθμό κλειδωμάτων το οποίο οδηγεί σε σημαντική χρήση πόρων και μπλοκάρισμα άλλων συναλλαγών. Για παράδειγμα, αν ο χρήστης Α τρέχει μια συναλλαγή η οποία πρέπει να διαβάσει μια σειρά δεδομένων τότε ο χρήστης Β πρέπει να περιμένει μέχρι να τελειώσει η συναλλαγή του Α. Συχνά εφαρμόζεται κλείδωμα δυο φάσεων για να εγγυηθεί πλήρης απομόνωση.
Μια εναλλακτική λύση κλειδώματος είναι ο έλεγχος ταυτοχρονισμού multiversion με τον οποίο η ΒΔ παρέχει σε κάθε συναλλαγή read προτεραιότητα και μη τροποποιημένη έκδοση των δεδομένων, τα οποία τροποποιούνται από άλλη ενεργή συναλλαγή που θέλει να τα τροποποιήσει. Αυτό επιτρέπει στις συναλλαγές που θέλουν να κάνουν read να το κάνουν χωρίς κλείδωμα. Για παράδειγμα, οι write συναλλαγές δεν μπλοκάρουν τις read συναλλαγές και οι συναλλαγές read δεν μπλοκάρουν τις συναλλαγές write. Πηγαίνοντας στο προηγούμενο παράδειγμα όταν η συναλλαγή του χρήστη Α απαιτήσει δεδομένα τα οποία τροποποιεί εκείνη την στιγμή η συναλλαγή του Β τότε η ΒΔ παρέχει στον Α τα δεδομένα τα οποία υπήρχαν πριν η συναλλαγή του χρήστη Β αρχίσει την τροποποίηση. Ο χρήστης Α έχει μια συνεπή όψη της ΒΔ ακόμα και αν άλλη χρήστες την τροποποιούν. Για μια τέτοια υλοποίηση δεν είναι τόσο αυστηρή η ιδιότητα της απομόνωσης, η οποία ονομάζεται snapshot isolation.

Κατανεμημένες Συναλλαγές

Εξασφαλίζοντας τις ιδιότητες ACID σε μια κατανεμημένη συναλλαγή σε μια κατανεμημένη ΒΔ όπου δεν υπάρχει ένας κόμβος για όλα τα δεδομένα μια συναλλαγή παρουσιάζει πολλές επιπλοκές. Το δίκτυο μπορεί να αποσυνδεθεί ή ένας κόμβος να ολοκληρωθεί επιτυχώς και μετά να πρέπει να επιστρέψει στην προηγούμενη κατάσταση επειδή απέτυχε ένας άλλος κόμβος. Το πρωτόκολλο two-phase commit (2PC) (το οποίο είναι διαφορετικό από το πρωτόκολλο κλειδώματος δύο φάσεων) παρέχει ατομικότητα για κατανεμημένες συναλλαγές ώστε να εξασφαλίσει ότι κάθε μέρος της συναλλαγής να συμφωνεί αν η συναλλαγή πρέπει να γίνει commit ή abort. Συνοπτικά, στην πρώτη φάση ένας κόμβος (ο συντονιστής) διερευνά τους άλλους κόμβους και μόνο όταν απαντήσουν ότι είναι έτοιμοι επικυρώνει την συναλλαγή στη δεύτερη φάση.