Sobes.tech
Middle

Τι είναι οι μπλοκαρίσματα στο πλαίσιο εργασίας με βάσεις δεδομένων και γιατί είναι απαραίτητα;

sobes.tech AI

Απάντηση από AI

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

Απαιτούνται για την επίλυση των ακόλουθων προβλημάτων:

  • Καταστάσεις αγώνα (Race Conditions): Κατάσταση όπου η σειρά εκτέλεσης των ενεργειών επηρεάζει το τελικό αποτέλεσμα. Οι αποκλεισμοί διασφαλίζουν ότι οι ενέργειες εκτελούνται διαδοχικά ή με ασφαλή σειρά για τα δεδομένα.
  • Ανεπίσημες αναγνώσεις (Inconsistent Reads): Ένας διαδικασία διαβάζει δεδομένα ενώ ένας άλλος τα τροποποιεί, κάτι που μπορεί να οδηγήσει σε ενδιάμεση ή μη ολοκληρωμένη κατάσταση δεδομένων. Οι αποκλεισμοί μπορούν να αποτρέψουν αυτό.
  • Χαμένες ενημερώσεις (Lost Updates): Δύο διαδικασίες διαβάζουν τα ίδια δεδομένα, τα τροποποιούν και τα αποθηκεύουν. Η τελευταία αποθήκευση αντικαθιστά τις αλλαγές του πρώτου, χάνοντάς τες. Οι αποκλεισμοί βοηθούν στην αποφυγή απώλειας αλλαγών.
  • Φανταστικές αναγνώσεις (Phantom Reads): Σε μια ίδια συναλλαγή, ένα επαναλαμβανόμενο ερώτημα επιστρέφει διαφορετικό σύνολο γραμμών επειδή μια άλλη διαδικασία πρόσθεσε ή διαγράψε γραμμές που πληρούν τις συνθήκες του ερωτήματος.

Βασικοί τύποι αποκλεισμών:

  • Κοινόχρηστος (Shared/Read Lock): Επιτρέπει σε πολλαπλές συναλλαγές να διαβάζουν τα ίδια δεδομένα ταυτόχρονα. Δεν επιτρέπει εγγραφές σε αυτά τα δεδομένα.
  • Αποκλειστικός (Exclusive/Write Lock): Παρέχει μονοπωλιακή πρόσβαση στα δεδομένα. Μόνο μια συναλλαγή μπορεί να έχει αποκλειστικό κλείδωμα σε συγκεκριμένα δεδομένα σε μια στιγμή. Δεν επιτρέπει αναγνώσεις ή εγγραφές σε αυτά τα δεδομένα.

Οι αποκλεισμοί μπορούν να εφαρμοστούν σε διαφορετικά επίπεδα:

  • Επίπεδο βάσης δεδομένων: Κλειδώνει ολόκληρη τη βάση δεδομένων. Σπάνια χρησιμοποιείται.
  • Επίπεδο πίνακα: Κλειδώνει ολόκληρο τον πίνακα. Λιγότερο λεπτομερές, μπορεί να μειώσει τον ανταγωνισμό.
  • Επίπεδο γραμμής: Κλειδώνει μια συγκεκριμένη γραμμή. Πιο λεπτομερές, υποστηρίζει υψηλό ανταγωνισμό, αλλά μπορεί να απαιτεί περισσότερους πόρους.
  • Επίπεδο σελίδας: Κλειδώνει μια σελίδα δεδομένων (μονάδα αποθήκευσης σε SGBD που περιέχει πολλές γραμμές). Μια συμβιβαστική λύση μεταξύ κλειδώματος ολόκληρου πίνακα και γραμμής.

Η υλοποίηση των αποκλεισμών εξαρτάται από το συγκεκριμένο SGBD (π.χ., InnoDB και MyISAM στο MySQL έχουν διαφορετικές στρατηγικές, PostgreSQL κ.ά.). Στο PHP, συχνά χρησιμοποιούνται συναλλαγές για τη διαχείριση των αποκλεισμών.

-- Παράδειγμα χρήσης συναλλαγής και αποκλεισμού σε SQL
START TRANSACTION;

SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- Το FOR UPDATE επιβάλλει αποκλειστικό κλείδωμα στη επιλεγμένη γραμμή

UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;

COMMIT;
-- Ή ROLLBACK σε περίπτωση σφάλματος