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

Αυτή η προστασία ονομάζεται κλείδωμα — lock.

Αν μια άλλη εργασία χρειάζεται τα ίδια δεδομένα, μπορεί να περιμένει.

Αναμονή και deadlock

Η απλή αναμονή μπορεί να εξελιχθεί φυσιολογικά:

Η A κρατά μια γραμμή. Η B περιμένει. Η A ολοκληρώνεται. Η B συνεχίζει. 

Αυτό λέγεται blocking.

Σε ένα deadlock, η αναμονή γίνεται κύκλος:

Η A κρατά τη γραμμή 1 και περιμένει τη γραμμή 2. Η B κρατά τη γραμμή 2 και περιμένει τη γραμμή 1. 

Καμία δεν μπορεί να συνεχίσει χωρίς παρέμβαση.

Ο SQL Server επιλέγει μια συναλλαγή, την ακυρώνει με rollback και επιστρέφει το σφάλμα 1205.

Η άλλη μπορεί πλέον να συνεχίσει. Τεκμηρίωση Microsoft

Παράδειγμα πρόληψης

Έστω ότι δύο εργασίες ενημερώνουν τους ίδιους δύο μετρητές.

Αν η μία ξεκινά από τον μετρητή 1 και η άλλη από τον 2, μπορεί να σχηματιστεί ο προηγούμενος κύκλος.

Χρησιμοποιούμε την ίδια σειρά και στις δύο:

BEGIN TRANSACTION; UPDATE Counters SET Value = Value + 1 WHERE Id = 1; UPDATE Counters SET Value = Value + 1 WHERE Id = 2; COMMIT; 

Έτσι αφαιρούμε τη συγκεκριμένη αιτία του deadlock. Μπορεί ακόμη να υπάρξει απλή αναμονή.

Τι βοηθά στην πράξη

  • Ίδια σειρά πρόσβασης στα δεδομένα.
  • Μικρή διάρκεια συναλλαγής.
  • Αποστολή email και κλήσεις εξωτερικών υπηρεσιών έξω από τη συναλλαγή.
  • Αναζήτηση και ενημέρωση μόνο των απαραίτητων δεδομένων.

Τι επαναλαμβάνουμε μετά την αποτυχία

Η συναλλαγή που ακυρώθηκε χρειάζεται νέα προσπάθεια από την αρχή.

Επαναλαμβάνουμε ολόκληρη τη συναλλαγή, με καθαρή κατάσταση, περιορισμένες προσπάθειες και μικρή αναμονή μεταξύ τους.

Αν τα deadlocks επαναλαμβάνονται συχνά, εξετάζουμε την καταγραφή τους, γνωστή ως deadlock graph. Δείχνει ποιες εντολές και ποια δεδομένα συμμετείχαν στον κύκλο.

Η αυτόματη επανάληψη βοηθά σε περιστασιακές συγκρούσεις. Οι συχνές αποτυχίες χρειάζονται διάγνωση της αιτίας. Οδηγός Microsoft για deadlocks