Αυτήν τη στιγμή είστε εκτός σύνδεσης, σε αναμονή για επανασύνδεση στο Internet

INF: Κατανόηση και επίλυση προβλημάτων αποκλεισμού του SQL Server

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο έχει μεταφραστεί χρησιμοποιώντας λογισμικό μηχανικής μετάφρασης της Microsoft και μπορείτε να το διορθώσετε χρησιμοποιώντας την τεχνολογία Community Translation Framework (CTF) (Πλαίσιο μετάφρασης κοινότητας). Η Microsoft παρέχει μηχανική μετάφραση, επεξεργασία μετά τη μηχανική μετάφραση από την κοινότητα και άρθρα μεταφρασμένα από επαγγελματίες προκειμένου να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής βάσης σε πολλές γλώσσες. Τα άρθρα μηχανικής μετάφρασης και αυτά που επεξεργάζονται ύστερα από μηχανική μετάφραση ενδέχεται να περιέχουν σφάλματα στο λεξιλόγιο, στη σύνταξη ή/και στη γραμματική. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες μας. Για περισσότερες πληροφορίες σχετικά με το CTF, μεταβείτε στην τοποθεσία http://support.microsoft.com/gp/machine-translation-corrections/el.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: 224453
Περίληψη
Σε αυτό το άρθρο, ο όρος "σύνδεση" αναφέρεται σε μία συνδεδεμένος στην περίοδο λειτουργίας της βάσης δεδομένων. Κάθε σύνδεση εμφανίζεται ως Αναγνωριστικό περιόδου λειτουργίας (SPID). Κάθε μία από αυτές τις SPID αναφέρεται συχνά ως διεργασία, παρόλο που δεν είναι μια ξεχωριστή διαδικασία περιβάλλον με την συνηθισμένη έννοια. Αντίθετα, κάθε SPID αποτελείται από τους πόρους του διακομιστή και τις δομές δεδομένων που είναι αναγκαία για να εξυπηρετήσει τις αιτήσεις μιας σύνδεσης μόνο από έναν συγκεκριμένο υπολογιστή-πελάτη. Μια εφαρμογή υπολογιστή-πελάτη μπορεί να έχει μία ή περισσότερες συνδέσεις. Από την πλευρά του διακομιστή SQL, υπάρχει διαφορά μεταξύ των πολλαπλών συνδέσεων από μια εφαρμογή υπολογιστή-πελάτη σε έναν μόνο υπολογιστή-πελάτη και πολλαπλές συνδέσεις από πολλές εφαρμογές προγράμματος-πελάτη ή πολλούς υπολογιστές-πελάτες. Μια σύνδεση μπορεί να αποκλείσει άλλη σύνδεση, ανεξάρτητα από το αν αυτά προκύπτει από την ίδια εφαρμογή ή εφαρμογές ξεχωριστά σε δύο διαφορετικούς υπολογιστές-πελάτες.
Περισσότερες πληροφορίες
Ο αποκλεισμός είναι ένα χαρακτηριστικό αναπόφευκτη από οποιοδήποτε σύστημα διαχείρισης σχεσιακής βάσης δεδομένων (RDBMS) με σύμπτωση με βάση το κλείδωμα. Στον SQL Server, ο αποκλεισμός παρουσιάζεται όταν ένα αναγνωριστικό SPID διατηρεί ένα κλείδωμα για έναν συγκεκριμένο πόρο και ένα δεύτερο SPID προσπαθεί να τα αποκτήσει αντιφατικό τύπο κλειδώματος στον ίδιο πόρο. Συνήθως, το χρονικό πλαίσιο για την οποία το πρώτο SPID κλειδώνει ο πόρος είναι πολύ μικρό. Όταν αυτό απελευθερώνει το κλείδωμα, η δεύτερη σύνδεση είναι ελεύθερος να αποκτά τη δική του κλειδώματος στον πόρο και να συνεχίσετε την επεξεργασία. Αυτή η συμπεριφορά είναι φυσιολογική και αυτό μπορεί να συμβεί πολλές φορές σε όλη τη διάρκεια της ημέρας με καμία αισθητή επίδραση στις επιδόσεις του συστήματος.

Το περιβάλλον διάρκεια και συναλλαγών ενός ερωτήματος καθορίζουν πόσο καιρό διατηρούνται τα κλειδώματα και, ως εκ τούτου, τις επιπτώσεις τους για άλλα ερωτήματα. Εάν το ερώτημα δεν εκτελείται μέσα σε μια συναλλαγή (και δεν υπάρχουν συμβουλές κλειδώματος που χρησιμοποιούνται), τα κλειδώματα για προτάσεις SELECT θα μόνο φυλάσσονται σε έναν πόρο, τη στιγμή που στην πραγματικότητα γίνεται ανάγνωση και όχι για τη διάρκεια του ερωτήματος. Για προτάσεις INSERT, UPDATE και DELETE, τα κλειδώματα διατηρούνται για όλη τη διάρκεια του ερωτήματος, τόσο για συνέπεια δεδομένων και για να επιτρέψετε στο ερώτημα να ανακτηθούν εάν είναι απαραίτητο.

Για τα ερωτήματα εκτελούνται μέσα σε μια συναλλαγή, τη διάρκεια για την οποία διατηρούνται τα κλειδώματα προσδιορίζονται από τον τύπο του ερωτήματος, το επίπεδο απομόνωσης συναλλαγής, και να κλειδώσετε ή όχι υποδείξεις που χρησιμοποιούνται στο ερώτημα. Για την περιγραφή του κλειδώματος, συμβουλές κλειδώματος και επίπεδα απομόνωσης συναλλαγής, ανατρέξτε στα ακόλουθα θέματα στα ηλεκτρονικά εγχειρίδια του SQL Server:
  • Κλείδωμα στο μηχανισμό βάσης δεδομένων
  • Κλείδωμα προσαρμογής και γραμμής εκδόσεων
  • Λειτουργίες κλειδώματος
  • Κλείδωμα συμβατότητας
  • Γραμμή με βάση την τήρηση ιστορικού εκδόσεων απομόνωση επιπέδων στο μηχανισμό βάσης δεδομένων
  • Τον έλεγχο των συναλλαγών (μηχανισμός διαχείρισης βάσεων δεδομένων)
Όταν το κλείδωμα και τον αποκλεισμό αύξηση στο σημείο όπου υπάρχει δυσμενή επίδραση στην απόδοση του συστήματος, είναι συνήθως οφείλεται σε έναν από τους παρακάτω λόγους:
  • SPID διατηρεί τα κλειδώματα σε ένα σύνολο πόρων για μια extendedperiod χρόνο πριν ακόμη τα αφήσετε. Ο αποκλεισμός αυτός ο τύπος επιλύει itselfover χρόνο, αλλά μπορεί να προκαλέσει υποβάθμιση των επιδόσεων.
  • SPID διατηρεί τα κλειδώματα σε ένα σύνολο πόρων και ποτέ releasesthem. Ο αποκλεισμός αυτός ο τύπος δεν επιλυθεί εαυτό και αποτρέπει την πρόσβαση σε πόρους theaffected αόριστο χρονικό διάστημα.
Στο πρώτο σενάριο παραπάνω, το ζήτημα αποκλεισμού επιλύει ίδια με τον καιρό καθώς το SPID αποδεσμεύει τα κλειδώματα. Ωστόσο, η κατάσταση μπορεί να είναι πολύ ρευστού ως διαφορετική αιτία SPID αποκλεισμού σε διαφορετικούς πόρους με τον καιρό, δημιουργώντας ένα κινούμενο στόχο. Για το λόγο αυτό, αυτές τις περιπτώσεις μπορεί να είναι δύσκολο να την αντιμετώπιση προβλημάτων με χρήση SQL Server Enterprise Manager ή επιμέρους ερωτήματα SQL. Η δεύτερη κατάσταση έχει ως αποτέλεσμα μια συνεπή κατάσταση που μπορεί να είναι πιο εύκολη η διάγνωση.

Συλλογή πληροφοριών αποκλεισμός

Για την εξουδετέρωση των συνεπειών της δυσκολίας των αντιμετώπιση προβλημάτων αποκλεισμού, ένας διαχειριστής βάσης δεδομένων να χρησιμοποιήσετε δέσμες ενεργειών SQL που παρακολουθούν συνεχώς την κατάσταση κλειδώματος και αποκλεισμός στον SQL Server. Αυτές οι δέσμες ενεργειών μπορούν να παρέχουν στιγμιότυπα της συγκεκριμένες εμφανίσεις με τον καιρό, συνεπάγεται μια συνολική εικόνα του προβλήματος. Για την περιγραφή του τρόπου παρακολούθησης αποκλεισμού με δέσμες ενεργειών SQL, ανατρέξτε στα ακόλουθα άρθρα της Γνωσιακής Βάσης της Microsoft:
271509 Τον τρόπο εποπτείας αποκλεισμού του SQL Server 2005 και του SQL Server 2000
Οι δέσμες ενεργειών σε αυτό το άρθρο θα εκτελεί τις παρακάτω εργασίες. Όπου είναι δυνατόν, δίνεται η μέθοδος για την απόκτηση αυτών των πληροφοριών από το SQL Server Management Studio.
  1. Προσδιορίστε το SPID (Αναγνωριστικό περιόδου λειτουργίας) στην αρχή της αλυσίδας αποκλεισμού και την πρόταση SQL.
    Εκτός από τη χρήση των δεσμών ενεργειών στο άρθρο της Γνωσιακής βάσης που αναφέρθηκαν προηγουμένως, youcan προσδιορίζουν την κεφαλή της αλυσίδας αποκλεισμού, χρησιμοποιώντας τις δυνατότητες που παρέχονται μέσω του SQL Server Management Studio. Για να γίνει αυτό, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους:
    • Κάντε δεξιό κλικ στο αντικείμενο του διακομιστή, αναπτύξτε αναφορές, ανάπτυξη Τυπικές αναφορέςκαι, στη συνέχεια, κάντε κλικ στην επιλογή δραστηριότητα – όλες τις συναλλαγές αποκλεισμού. Αυτή η αναφορά εμφανίζει τις συναλλαγές στην κεφαλή του αποκλεισμού αλυσίδα. Εάν αναπτύξετε τη συναλλαγή, η εκτύπωση θα εμφανίσει τις συναλλαγές που αποκλείονται από την κεφαλή συναλλαγή. Αυτή η αναφορά θα εμφανίζει επίσης την "Αποκλεισμός SQL" και "Ανενεργό δήλωση SQL".
    • Χρησιμοποιήστε DBCC INPUTBUFFER (<spid>) για να βρείτε την τελευταία πρόταση που υποβλήθηκε από SPID.</spid>
  2. Βρείτε το επίπεδο ένθεσης συναλλαγή και κατάσταση διεργασίας από το SPID αποκλεισμού.
    Το επίπεδο ένθετης συναλλαγής SPID είναι διαθέσιμες στην καθολική μεταβλητή the@@TRANCOUNT. Ωστόσο, αυτό μπορεί να προσδιοριστεί από εξωτερικές theSPID υποβάλλοντας ερωτήματα στον πίνακα sysprocesses ως εξής:

    SELECT open_tran FROM master.sys.sysprocesses WHERE SPID=<blocking SPID number>go						
    Η τιμή που επιστρέφεται είναι η τιμή @@TRANCOUNT για το SPID. Αυτό showsthe συναλλαγή επίπεδο ένθεσης για το SPID αποκλεισμού, που με τη σειρά τους να explainwhy κατέχει κλειδώματα. Για παράδειγμα, εάν η τιμή είναι μεγαλύτερη από το μηδέν, είναι theSPID στη μέση του μια συναλλαγή (στην οποία περίπτωση αναμένεται ότι ορισμένες itretains κλειδώνει έχει αποκτήσει, ανάλογα με το isolationlevel συναλλαγή).

    Μπορείτε επίσης να ελέγξετε για να δείτε εάν κάθε μακροπρόθεσμα Άνοιγμα transactionexists στη βάση δεδομένων με χρήση DBCC OPENTRANόνομα_βάσης_δεδομένων.

Συγκέντρωση πληροφοριών ανίχνευσης Profiler διακομιστή SQL

Εκτός από τις παραπάνω πληροφορίες, συχνά είναι απαραίτητη για να καταγράψετε μια ανίχνευση δημιουργίας προφίλ, των δραστηριοτήτων του διακομιστή για να εξετάσει προσεκτικά το ζήτημα αποκλεισμού στον SQL Server. Εάν το SPID εκτελεί πολλές προτάσεις μέσα σε μια συναλλαγή, μόνο η τελευταία statementthat υποβλήθηκε θα εμφανίζονται στην έκθεση, buffer εισόδου ή εξόδου εποπτεία της δραστηριότητας. Ωστόσο, μία από τις προηγούμενες εντολές μπορεί να είναι η αιτία κλειδώματα εξακολουθεί να συνεχίζονται. Ένα ίχνος Profiler θα μπορείτε να δείτε όλες τις εντολές που εκτελούνται από SPID εντός της τρέχουσας συναλλαγής. Τα παρακάτω βήματα θα σας βοηθήσει να ρυθμίσετε Profiler διακομιστή SQL, για να καταγράψετε μια ανίχνευση.
  1. Ανοίξτε το SQL Server Profiler.
  2. Στο μενού αρχείο , επιλέξτε Δημιουργίακαι, στη συνέχεια, κάντε κλικ στην επιλογή Ανίχνευση.
  3. Στην καρτέλα Γενικά , καθορίστε ένα όνομα ανίχνευσης και ένα όνομα αρχείου για την καταγραφή των δεδομένων.

    Σημαντικό Το αρχείο ανίχνευσης πρέπει να εγγραφεί ένα fast τοπική ή κοινόχρηστο δίσκο. Αποφύγετε την ανίχνευση σε μια αργή μονάδα δίσκου ή δικτύου. Επίσης βεβαιωθείτε ότι ο διακομιστής επεξεργάζεται ανίχνευσης δεδομένων είναι επιλεγμένο.
  4. Στην καρτέλα Συμβάντα επιλογής , κάντε κλικ για να επιλέξετε την Εμφάνιση όλων των συμβάντων και τα πλαίσια ελέγχου Εμφάνιση όλων των στηλών .
  5. Στην καρτέλα Συμβάντα επιλογής , προσθέστε τους τύπους συμβάντων που αναφέρονται στον πίνακα 1 για την ανίχνευση.

    Επιπλέον, μπορείτε να συμπεριλάβετε τους πρόσθετους τύπους συμβάντων που αναφέρονται στον πίνακα 2 για περισσότερες πληροφορίες. Εάν εκτελείτε σε ένα περιβάλλον μεγάλου όγκου παραγωγής, μπορεί να αποφασίσετε να χρησιμοποιήσετε μόνο τα συμβάντα στον πίνακα 1, εφόσον είναι συνήθως επαρκή για να αντιμετωπίσετε τα περισσότερα προβλήματα αποκλεισμού. Καθώς και τα πρόσθετα συμβάντα στον πίνακα 2 μπορεί να διευκολύνει να προσδιορίσετε γρήγορα την προέλευση ενός προβλήματος (ή τα συμβάντα αυτά μπορεί να είναι απαραίτητο για να προσδιορίσετε την πρόταση υπαίτιο σε μια διαδικασία πολλών πρότασης). Ωστόσο, καθώς και τα συμβάντα στον πίνακα 2 θα επίσης Προσθήκη στο φορτίο στο σύστημα και αύξηση του μεγέθους εξόδου ανίχνευσης.
Πίνακας 1: Τύποι συμβάντων
ΕπικεφαλίδαΣυμβάν
Σφάλματα και προειδοποιήσειςΕξαίρεση
Σφάλματα και προειδοποιήσειςΠροσοχή
Έλεγχος ασφαλείαςΈλεγχος σύνδεσης
Έλεγχος ασφαλείαςΈλεγχος αποσύνδεσης
Περίοδοι λειτουργίαςΥπάρχουσα σύνδεση
Αποθηκευμένες διαδικασίεςRPC: εκκίνηση
TSQLSQL:BatchStarting

Πίνακας 2: Τύποι πρόσθετων συμβάντων
ΕπικεφαλίδαΣυμβάν
ΣυναλλαγέςΤου
ΣυναλλαγέςSQLTransaction
Αποθηκευμένες διαδικασίεςRPC: ολοκληρώθηκε
TSQLSQL:BatchCompleted
Αποθηκευμένες διαδικασίεςSP:StmtStarting
Αποθηκευμένες διαδικασίεςSP:StmtCompleted

Για περισσότερες πληροφορίες σχετικά με τη δημιουργία προφίλ διακομιστή SQL, ανατρέξτε SQL Server Books Online.

Αναγνώριση και επίλυση κοινά σενάρια αποκλεισμού

Εξετάζοντας τις παραπάνω πληροφορίες, μπορείτε να προσδιορίσετε την αιτία του περισσότερα προβλήματα αποκλεισμού. Το υπόλοιπο αυτού του άρθρου είναι μια συζήτηση σχετικά με τον τρόπο για να χρησιμοποιήσετε αυτές τις πληροφορίες για να προσδιορίσετε και να επιλύσετε ορισμένα κοινά σενάρια αποκλεισμού. Αυτήν τη συζήτηση προϋποθέτει έχετε χρησιμοποιήσει τα αποκλεισμού δέσμης ενεργειών στο άρθρο 271509 (αναφέρεται παραπάνω) για να καταγράψετε πληροφορίες σχετικά με το SPID αποκλεισμού και έχετε κάνει ένα ίχνος Profiler με τα συμβάντα που περιγράφονται παραπάνω.

Προβολή αποκλεισμού δέσμη ενεργειών

Εξετάστε το αποτέλεσμα sys.sysprocesses για να προσδιορίσετε τις κεφαλές του αποκλεισμού αλυσίδες
Εάν δεν έχετε καθορίσει γρήγορη κατάσταση λειτουργίας για τα αποκλεισμού δέσμης ενεργειών, θα υπάρχει μια ενότητα με τίτλο "SPID στην αρχή του αποκλεισμού αλυσίδες" thatlists το SPID που εμποδίζουν άλλες SPID στη δέσμη ενεργειών.
SPIDs at the head of blocking chains
Εάν καθοριστεί η Γρήγορη επιλογή, μπορείτε να καθορίσετε ακόμα theblocking κεφαλές ελέγχοντας κατά την έξοδο sys.sysprocesses και ακολουθώντας την ιεραρχία των το SPID που αναφέρεται στη στήλη αποκλεισμένο.
Εξετάστε το αποτέλεσμα sys.sysprocesses για πληροφορίες σχετικά με το SPID στην αρχή της αλυσίδας αποκλεισμού.
Είναι σημαντικό να αξιολογήσετε τα ακόλουθα πεδία sys.sysprocesses :

Κατάσταση

Αυτή η στήλη εμφανίζει την κατάσταση της συγκεκριμένης SPID. Συνήθως, η κατάσταση σε κατάσταση αναστολής λειτουργίας υποδεικνύει ότι το SPID έχει ολοκληρώσει την εκτέλεση και είναι σε αναμονή της εφαρμογής για να υποβάλετε ένα άλλο ερώτημα ή δέσμης. Η κατάσταση εκτελέσιμες, εκτελείή sos_scheduler_yield υποδεικνύει ότι το SPID αυτήν τη στιγμή επεξεργάζεται ένα ερώτημα. Ο παρακάτω πίνακας δίνει σύντομες εξηγήσεις σχετικά με τις διάφορες τιμές κατάστασης.
ΚατάστασηΈννοια
ΦόντοΤο SPID εκτελεί μια εργασία παρασκηνίου, όπως ο εντοπισμός αδιεξόδου.
Σε αναστολή λειτουργίαςΤο SPID δεν εκτελείται αυτήν τη στιγμή. Αυτό συνήθως δηλώνει ότι το SPID αναμένει μια εντολή από την εφαρμογή.
ΕκτέλεσηΤο SPID εκτελείται αυτήν τη στιγμή σε ένα χρονοδιάγραμμα.
ΕκτελέσιμεςΤο SPID βρίσκεται στην ουρά εκτελέσιμες ένα χρονοδιάγραμμα και αναμονή για χρόνο προγραμματισμού.
Sos_scheduler_yieldΤο SPID λειτουργούσε, αλλά έχει εθελοντικά παράγονται ενδεχομένως η μονάδα χρόνου από το χρονοδιάγραμμα για να επιτρέψετε μια άλλη SPID να λαμβάνει ώρα το χρονοδιάγραμμα.
Σε αναστολήΤο SPID αναμένει ένα συμβάν, όπως ένα κλείδωμα ή μάνδαλο.
ΕπαναφοράΤο SPID έχει επαναφοράς μιας συναλλαγής.
DefwakeupΔηλώνει ότι το SPID είναι σε αναμονή για έναν πόρο που βρίσκεται σε διαδικασία που απελευθερώνεται. Το πεδίο waitresource πρέπει να υποδείξετε στον εν λόγω πόρο.

Open_tran

Αυτό το πεδίο σάς ενημερώνει για το επίπεδο ένθεσης συναλλαγή το SPID. Εάν αυτή η τιμή είναι μεγαλύτερη από 0, το SPID βρίσκεται μέσα σε ανοιχτή συναλλαγή και να διατηρούν κλειδώματα που αποκτήθηκε από οποιαδήποτε πρόταση μέσα στη συναλλαγή.

Lastwaittype, waittype και waittime

Το πεδίο " lastwaittype " είναι μια αναπαράσταση συμβολοσειράς του πεδίου waittype , το οποίο είναι δεσμευμένο εσωτερική δυαδική στήλη. Εάν το waittype είναι 0x0000, το SPID δεν αναμένει αυτή τη στιγμή για κάτι και η τιμή lastwaittype δηλώνει το τελευταίο waittype που είχε το SPID. Εάν το waittype δεν είναι μηδέν, η τιμή lastwaittype δηλώνει την τρέχουσα waittype το SPID.

Για μια σύντομη περιγραφή των διαφορετικών lastwaittype και waittype τιμών, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
822101 Περιγραφή των στηλών waittype και lastwaittype στον πίνακα master.dbo.sysprocesses του SQL Server 2000 και τον SQL Server 2005
Για περισσότερες πληροφορίες σχετικά με το sys.dm_os_wait_stats, ανατρέξτε στην ενότητα SQL Server Books Online.

Η τιμή waittime μπορεί να χρησιμοποιηθεί για να προσδιορίσετε αν το SPID πραγματοποιεί πρόοδο. Όταν ένα ερώτημα προς τον πίνακα sys.sysprocesses επιστρέφει μια τιμή στη στήλη waittime που είναι μικρότερη από την τιμή waittime από ένα προηγούμενο ερώτημα της sys.sysprocesses, αυτό υποδεικνύει ότι το κλείδωμα της προηγούμενης ήταν αποκτήθηκε και θα κυκλοφορήσει και είναι τώρα σε αναμονή σε ένα νέο κλείδωμα (με την προϋπόθεση waittime μη μηδενική). Αυτό μπορεί να επαληθευτεί, συγκρίνοντας το waitresource μεταξύ sys.sysprocesses εξόδου.

Waitresource

Αυτό το πεδίο δηλώνει τον πόρο που SPID είναι σε αναμονή. Ο παρακάτω πίνακας παραθέτει κοινές μορφές waitresource και σημασία τους:
ΠόροςΜορφήΠαράδειγμα
ΠίνακαςDatabaseID:ObjectID:IndexIDΚΑΡΤΈΛΑ: 5:261575970:1
Σε αυτήν την περίπτωση, η βάση δεδομένων ID 5 είναι το δείγμα βάσης δεδομένων pubs και αντικείμενο ID 261575970 είναι τον πίνακα titles και 1 είναι το συγκεντρωτικό ευρετήριο.
ΣελίδαDatabaseID:FileID:PageIDΣΕΛΊΔΑ: 5:1:104
Σε αυτήν την περίπτωση, η βάση δεδομένων ID 5 είναι pubs, αρχείο ID 1 είναι το κύριο αρχείο δεδομένων και σελίδα 104 είναι μια σελίδα που ανήκει στον πίνακα τίτλων .

Για να προσδιορίσετε το αναγνωριστικό αντικειμένου που ανήκει στη σελίδα, χρησιμοποιήστε την εντολή DBCC ΣΕΛΊΔΑΣ (dbid, fileid, pageid, output_option) και δείτε το m_objId. Για παράδειγμα:
DBCC TRACEON ( 3604 )DBCC PAGE ( 5 , 1 , 104 , 3 )
ΚλειδίDatabaseID:Hobt_id (τιμή κλειδιού κατακερματισμού για κλειδί ευρετήριο)ΚΛΕΙΔΊ: 5:72057594044284928 (3300a4f361aa)

Στην περίπτωση αυτή, βάση δεδομένων ID 5 είναι Pubs, Hobt_ID 72057594044284928 που αντιστοιχεί σε μη συμπλέγματος 2 index_id για το αναγνωριστικό αντικειμένου 261575970 (πίνακαtitles ). Χρησιμοποιήστε την προβολή καταλόγου sys.partitions για να συσχετίσετε το hobt_id με ένα επιμέρους ευρετήριο id και το αναγνωριστικό αντικειμένου. Δεν υπάρχει τρόπος για να unhash το ευρετήριο κατακερματισμού κλειδιού σε μια τιμή κλειδιού στο συγκεκριμένο ευρετήριο.
ΓραμμήDatabaseID:FileID:PageID:Slot(row)RID: 5:1:104:3

Στην περίπτωση αυτή, βάση δεδομένων ID 5 είναι pubs, αρχείο ID 1 είναι το κύριο αρχείο δεδομένων, σελίδα 104 είναι μια σελίδα που ανήκει στον πίνακα τίτλων και υποδοχή 3 υποδεικνύει την θέση της γραμμής στη σελίδα.
ΜεταγλώττισηDatabaseID:ObjectID [[ΜΕΤΑΓΛΏΤΤΙΣΗΣ]]ΚΑΡΤΈΛΑ: 5:834102012 [[ΜΕΤΑΓΛΏΤΤΙΣΗΣ]], αυτό δεν είναι ένα κλείδωμα πίνακα, αλλά μάλλον ένα μεταγλώττισης κλείδωμα σε μια αποθηκευμένη διαδικασία. Αναγνωριστικό 5 της βάσης δεδομένων pubs, αντικείμενο ID 834102012 είναι αποθηκευμένη διαδικασία usp_myprocedure. Για περισσότερες πληροφορίες σχετικά με αποκλεισμός οφείλεται κλειδώματα μεταγλώττισης, ανατρέξτε στο θέμα 263889 το άρθρο της Γνωσιακής Βάσης της Microsoft.
Άλλες στήλες

Οι υπόλοιπες στήλες sys.sysprocesses μπορούν να σας διαφωτίσουν ως προς τη ρίζα του προβλήματος καθώς και. Τη χρησιμότητά τους ποικίλλει ανάλογα με τις συνθήκες του προβλήματος. Για παράδειγμα, μπορείτε να προσδιορίσετε αν το ζήτημα συμβαίνει μόνο από ορισμένους υπολογιστές-πελάτες (hostname), σε ορισμένες βιβλιοθήκες δικτύου (net_library), κατά την τελευταία παρτίδα υπέβαλε SPID (last_batch), και ούτω καθεξής.
Εξετάστε το αποτέλεσμα DBCC INPUTBUFFER.
Για κάθε SPID στην αρχή μια αλυσίδα αποκλεισμού ή με waittype anon μηδέν, αποκλεισμού δέσμης ενεργειών θα εκτελεί DBCC INPUTBUFFER todetermine το τρέχον ερώτημα για το SPID.

Σε πολλές περιπτώσεις, αυτό είναι το ερώτημα που προκαλεί το που είναι κλειδώματα εμποδίζει άλλους χρήστες να διατηρηθεί. Ωστόσο, εάν το SPID βρίσκεται μέσα σε atransaction, τα κλειδώματα ενδέχεται να έχουν αποκτηθεί από ένα ερώτημα που εκτελείται ήδη, δεν είναι το τρέχον αρχείο. Επομένως, μπορείτε, επίσης, θα πρέπει να δείτε το αποτέλεσμα Profiler για το SPID, όχι μόνο για το inputbuffer.

Σημείωση Επειδή η δέσμη ενεργειών αποκλεισμού που αποτελείται από πολλά βήματα, την ispossible ότι SPID ενδέχεται να εμφανίζονται στην πρώτη ενότητα ως αρχηγοί της ένα blockingchain, αλλά από τη στιγμή που θα εκτελεστεί το ερώτημα DBCC INPUTBUFFER, είναι χωρίς longerblocking και το INPUTBUFFER δεν καταγράφεται. Αυτό υποδεικνύει ότι το ίδιο επίλυση για το SPID και blockingis μπορεί ή δεν μπορεί να υπάρχει πρόβλημα. Στο thispoint, μπορείτε να χρησιμοποιήσετε την γρήγορη έκδοση του αποκλεισμού δέσμης ενεργειών για να δοκιμάσετε toensure, καταγράφετε το inputbuffer πριν να απαλείφει (αν και υπάρχει ακόμα noguarantee) ή να προβάλετε τα δεδομένα από αυτό το χρονικό πλαίσιο για να καθορίσετε whatqueries το SPID εκτελούσε Profiler.

Προβολή των δεδομένων δημιουργίας προφίλ

Προβολή δεδομένων Profiler αποτελεσματικά είναι εξαιρετικά χρήσιμες στην επίλυση θέματα που την εμποδίζουν. Το σημαντικότερο που πρέπει να γνωρίζετε είναι ότι δεν χρειάζεται να δείτε όλα τα στοιχεία που καταγράφηκαν; είναι επιλεκτικό. Δημιουργία προφίλ παρέχει δυνατότητες για να σας βοηθήσει να αποτελεσματικά, προβάλετε τα δεδομένα. Στο πλαίσιο διαλόγου " Ιδιότητες " (από το μενού αρχείο , κάντε κλικ στην επιλογή Ιδιότητες), Profiler σας επιτρέπει να περιορίσετε τα δεδομένα που εμφανίζονται από την κατάργηση στηλών δεδομένων ή συμβάντα, ομαδοποίηση (ταξινόμηση) από στήλες δεδομένων και εφαρμογή φίλτρων. Μπορείτε να αναζητήσετε το ίχνος ολόκληρο ή μόνο μια συγκεκριμένη στήλη για συγκεκριμένες τιμές (από το μενού Επεξεργασία , κάντε κλικ στο κουμπί Εύρεση). Μπορείτε επίσης να αποθηκεύσετε τα δεδομένα Profiler σε πίνακα του SQL Server (στο μενού " αρχείο ", επιλέξτε Αποθήκευση ως και, στη συνέχεια, κάντε κλικ στο κουμπί πίνακα) και να εκτελέσετε ερωτήματα SQL εναντίον τους.

Προσέξτε ότι μπορείτε να εκτελέσετε φιλτράρισμα μόνο σε ένα αρχείο είχε αποθηκευτεί προηγουμένως ανίχνευσης. Εάν εκτελείτε αυτά τα βήματα σε ένα ενεργό ανίχνευσης, κινδυνεύετε να χάσετε δεδομένα που καταγράφηκε από την εκκίνηση της παρακολούθησης. Αποθήκευση ενός ενεργού παρακολούθησης σε ένα αρχείο ή πίνακα πρώτα (από το μενού αρχείο , κάντε κλικ στο κουμπί Αποθήκευση ως) και στη συνέχεια το ανοίξετε πάλι (στο μενού " αρχείο ", κάντε κλικ στην επιλογή Άνοιγμα) πριν να συνεχίσετε. Όταν εργάζεστε με ένα αρχείο αποθηκευμένο ανίχνευσης, το φιλτράρισμα δεν καταργήσετε μόνιμα τα δεδομένα που έχουν φιλτραριστεί, απλώς δεν εμφανίζει όλα τα δεδομένα. Μπορείτε να προσθέσετε και να καταργήσετε τα συμβάντα και στήλες δεδομένων, όπως είναι απαραίτητο για να εστιάσετε τις αναζητήσεις σας.

Τι πρέπει να αναζητήσετε:
  • Τι εντολές έχει το SPID επικεφαλής του ενός αποκλεισμού chainexecuted εντός της τρέχουσας συναλλαγής;
    Φιλτράρετε τα δεδομένα ανίχνευσης για aparticular SPID που είναι επικεφαλής του μια αλυσίδα αποκλεισμού (στο μενού " αρχείο ", κάντε κλικ στο κουμπί Ιδιότητεςκαι, στη συνέχεια, στη σελίδα φίλτρα , καθορίστε την τιμή SPID). Στη συνέχεια, μπορείτε να εξετάσετε την προηγούμενη ithas εκτέλεση εντολών με το χρόνο αυτό ο αποκλεισμός άλλων SPID. Εάν συμπεριλάβετε theTransaction συμβάντα, μπορούν εύκολα να αναγνωρίσουν όταν ξεκίνησε μια συναλλαγή.Διαφορετικά, μπορείτε να κάνετε αναζήτηση στη στήλη κειμένου για ΈΝΑΡΞΗ, ΑΠΟΘΉΚΕΥΣΗ, ΔΈΣΜΕΥΣΗ ή ΕΠΑΝΑΦΟΡΆ TRANSACTIONoperations. Χρησιμοποιήστε την τιμή open_tran από τον πίνακα " sysprocesses " για να εξασφαλίσετε εντοπίζει όλα τα συμβάντα κίνησης.Εάν γνωρίζετε τις εντολές που εκτελούνται και το περιβάλλον συναλλαγής θα μπορέσετε todetermine γιατί SPID κατέχει κλειδώματα.

    Θυμηθείτε, μπορείτε να removeevents και τα δεδομένα στήλες. Αντί να βλέπετε έναρξης και το completedevents, επιλέξτε μία. Αν το SPID αποκλεισμού δεν αποθηκευμένες διαδικασίες, απενεργοποιήσετε τοSP: εκκίνηση ή SP: ολοκλήρωση εκδηλώσεων, τα συμβάντα SQLBatch και RPC θα εμφανίσει την κλήση της διαδικασίας. Προβολή μόνο της whenyou συμβάντα SP πρέπει να δείτε αυτό το επίπεδο λεπτομερειών.
  • Ποια είναι η διάρκεια των ερωτημάτων για SPID κατά το headof αποκλεισμού αλυσίδες;
    Εάν συμπεριλάβετε το ολοκληρωμένο συμβάντα παραπάνω, η στήλη Duration θα εμφανίσει ο χρόνος εκτέλεσης του ερωτήματος. Αυτό μπορεί να βοηθήσει ερωτήματα μακράς διαρκείας youidentify που προκαλούν αποκλεισμού. Για να προσδιορίσετε γιατί thequery εκτελεί αργά, προβάλετε το CPU, Ανάγνωση, και εγγράφει στήλες, καθώς και το συμβάν Πλάνου εκτέλεσης .

Κατηγοριοποίηση κοινά σενάρια αποκλεισμού

Ο παρακάτω πίνακας αντιστοιχίζει κοινά συμπτώματα με τις πιθανές αιτίες τους. Ο αριθμός που υποδεικνύεται στη στήλη σενάριο αντιστοιχεί στον αριθμό της ενότητας "Κοινές αποκλεισμού σενάρια και επίλυση" αυτού του άρθρου παρακάτω. Οι στήλες Waittype, Open_Tranκαι την κατάσταση , ανατρέξτε στην sysprocesses πληροφορίες. Η επιλύει; στήλη δηλώνει αν είναι ή όχι τον αποκλεισμό θα επιλύσει από μόνη της.

Το σενάριοWaittypeOpen_TranΚατάστασηΕπιλύει;Άλλα συμπτώματα
1Μη μηδενική> = 0εκτελέσιμεςΝαι, όταν ολοκληρωθεί το ερώτημα.Physical_IO, CPU ή/και Memusage στήλες θα αυξηθεί με τον καιρό. Διάρκεια του ερωτήματος θα είναι υψηλή, όταν ολοκληρωθεί.
20x0000> 0σε αναστολή λειτουργίαςΌχι, αλλά SPID είναι δυνατό να τερματιστούν.Ένα σήμα προσοχή ενδέχεται να είναι ορατά στην ανίχνευση Profiler για αυτό το αναγνωριστικό SPID, υποδηλώνοντας ένα χρονικό όριο ερωτήματος ή Παρουσιάστηκε "Άκυρο".
30x0000> = 0εκτελέσιμεςΚωδ. Δεν θα λύσει μέχρι ο υπολογιστής-πελάτης λαμβάνει όλες τις γραμμές ή κλείνει τη σύνδεση. SPID είναι δυνατό να τερματιστούν, αλλά ενδέχεται να διαρκέσει έως 30 δευτερόλεπτα.Εάν open_tran = 0, και το SPID κατέχει κλειδώματα κατά προεπιλογή (ΑΝΆΓΝΩΣΗ COMMMITTED) είναι το επίπεδο απομόνωσης συναλλαγής, αυτή είναι μια πιθανή αιτία.
4Ποικίλλει> = 0εκτελέσιμεςΚωδ. Δεν θα λύσει μέχρι ακυρώνει ερωτήματα ή να κλείνει τις συνδέσεις υπολογιστή-πελάτη. SPID είναι δυνατό να τερματιστούν, αλλά ενδέχεται να διαρκέσει έως 30 δευτερόλεπτα.Η στήλη όνομα κεντρικού υπολογιστή σε sysprocesses για το SPID στην αρχή μια αλυσίδα αποκλεισμού θα είναι το ίδιο με το ένα από το SPID που εμποδίζει.
50x0000> 0ΕπαναφοράΝαι.Ένα σήμα προσοχή ενδέχεται να είναι ορατά στην ανίχνευση Profiler για αυτό το αναγνωριστικό SPID, υποδηλώνοντας ένα χρονικό όριο ερωτήματος ή Παρουσιάστηκε ακύρωσης ή απλώς μια δήλωση επαναφοράς έχει εκδοθεί.
60x0000> 0σε αναστολή λειτουργίαςΤελικά. Όταν τα Windows NT προσδιορίζει την περίοδο λειτουργίας δεν είναι πλέον ενεργή, θα διακοπεί η σύνδεση με το διακομιστή SQL.Η τιμή last_batchsysprocesses είναι πολύ νωρίτερα από την τρέχουσα ώρα.

Κοινά σενάρια αποκλεισμού και λύσεις

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

    Ανάλυση:
    Η λύση σε αυτό το πρόβλημα αποκλεισμού είναι η αναζήτηση forways για να βελτιστοποιήσετε το ερώτημα. Στην πραγματικότητα, αυτή η κλάση πρόβλημα αποκλεισμού μπορεί να justbe ένα ζήτημα επιδόσεων και απαιτείται για την άσκηση αυτή καθεαυτή. Για informationon αντιμετώπιση προβλημάτων σε ένα συγκεκριμένο ερώτημα αργή εκτέλεση, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
    243589 Τρόπος αντιμετώπισης προβλημάτων επιβραδύνει την εκτέλεση ερωτημάτων SQL Server 7.0 ή νεότερες εκδόσεις
    Για γενική εφαρμογή performancetroubleshooting, ανατρέξτε στο ακόλουθο άρθρο της Γνωσιακής Βάσης της Microsoft:
    224587 ΔΙΑΔΙΚΑΣΙΕΣ: Αντιμετώπιση προβλημάτων επιδόσεων της εφαρμογής με τον SQL Server
    Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα SQL Server 2008 Books Online Παρακολούθηση επιδόσεων και θέματα διαδικασίας ρύθμισης στην ακόλουθη τοποθεσία του MSDN στο Web: Εάν έχετε ένα ερώτημα μακράς διαρκείας που blockingother στους χρήστες και δεν είναι δυνατό να βελτιστοποιηθεί, μπορείτε να μετακινήσετε από ένα OLTPenvironment σε ένα σύστημα υποστήριξης αποφάσεων.
  2. Αποκλεισμός προκαλείται από ένα ανενεργό SPID που έχασε την παρακολούθηση του επιπέδου ένθεσης συναλλαγή

    Ο αποκλεισμός αυτός ο τύπος συχνά μπορούν να αναγνωριστούν με ένα SPIDthat σε αναστολή λειτουργίας ή να περιμένει μια εντολή, αλλά του οποίου επίπεδο ένθεσης συναλλαγή (@@TRANCOUNT, open_tran από το sysprocesses) είναι μεγαλύτερο από το μηδέν. Αυτό μπορεί να συμβεί εάν το χρονικό όριο ερωτήματος, applicationexperiences ή θέματα Ακύρωση χωρίς έκδοσης επίσης therequired στον αριθμό των καταστάσεων ΕΠΑΝΑΦΟΡΆΣ ή/και ΟΛΟΚΛΉΡΩΣΗΣ. Όταν ένα αναγνωριστικό SPID λαμβάνει aquery χρονικού ορίου ή "Άκυρο", αυτό θα τερματιστεί το τρέχον ερώτημα και η δέσμη, butdoes επαναφέρει αυτόματα ή ολοκλήρωση της συναλλαγής. Η εφαρμογή isresponsible για αυτό, όπως ο SQL Server δεν είναι δυνατό να υποθέσουμε ότι μια ολόκληρη transactionmust να επανέλθει απλώς λόγω ενός ερωτήματος ακυρώθηκαν. Το querytimeout ή "Άκυρο" θα εμφανιστεί ως ένα συμβάν σήματος ΠΡΟΣΟΧΉΣ για το SPID στο theProfiler ανίχνευσης.

    Για να το δείξουμε αυτό, εκδίδει το παρακάτω απλό queryfrom ανάλυση ερωτημάτων:

    BEGIN TRAN SELECT * FROM SYSOBJECTS S1, SYSOBJECTS S2-- Issue this after canceling querySELECT @@TRANCOUNTROLLBACK TRAN						
    Ενώ εκτελείται το ερώτημα, κάντε κλικ στο κόκκινο κουμπί Άκυρο . Μετά την ακύρωση του ερωτήματος, ΕΠΙΛΈΞΤΕ @@TRANCOUNT indicatesthat το επίπεδο ένθεσης συναλλαγή είναι μία. Αυτό είχε ένα DELETE ή ένα UPDATEquery ή είχαν χρησιμοποιηθεί στο ΕΠΙΛΈΞΤΕ HOLDLOCK, φυλάσσονται όλα τα wouldstill κλειδώματα που αποκτήθηκε. Ακόμα και με το παραπάνω ερώτημα, αν ένα άλλο ερώτημα είχε αποκτήσει κλειδώματα andheld νωρίτερα στη συναλλαγή, θα εξακολουθεί να είναι γινόταν όταν ακυρώθηκε η aboveSELECT.

    Λύσεις:

    • Οι εφαρμογές πρέπει να διαχειριστείτε σωστά επίπεδα ένθεσης συναλλαγή ή ενδέχεται να προκαλέσουν πρόβλημα αποκλεισμού μετά την ακύρωση του ερωτήματος με αυτόν τον τρόπο. Αυτό μπορεί να γίνει με διάφορους τρόπους:
      1. Στο πρόγραμμα χειρισμού σφαλμάτων της εφαρμογής προγράμματος-πελάτη, υποβάλλει δήλωση IF @@TRANCOUNT > 0 αντι ΕΠΑΝΑΦΟΡΆΣ μετά από κάθε σφάλμα, ακόμη και αν η εφαρμογή υπολογιστή-πελάτη δεν πιστεύετε ότι μια συναλλαγή έχει ανοίξει. Αυτό είναι απαραίτητο, επειδή μια αποθηκευμένη διαδικασία που ονομάζεται κατά τη διάρκεια της δέσμης θα μπορούσαν να έχουν ξεκινήσει μια συναλλαγή χωρίς να γνωρίζετε την εφαρμογή-πελάτη. Σημειώστε ότι ορισμένες συνθήκες, όπως η ακύρωση του ερωτήματος, εμποδίζει τη διαδικασία από την εκτέλεση πέρα από την τρέχουσα πρόταση, Ναι, ακόμα και αν η διαδικασία έχει λογική για να ελέγξετε αν @@ERROR <> 0 και ματαίωση της συναλλαγής, αυτός ο κωδικός επαναφορά δεν θα εκτελεστεί σε αυτές τις περιπτώσεις.
      2. Χρησιμοποιήστε ΟΡΙΣΜΌΣ XACT_ABORT ON για τη σύνδεση, ή σε οποιεσδήποτε αποθηκευμένες διαδικασίες που ξεκινούν συναλλαγές και να είναι δεν εκκαθάριση μετά από σφάλμα. Σε περίπτωση σφάλματος χρόνου εκτέλεσης, αυτή η ρύθμιση θα ματαίωση τυχόν ανοικτών συναλλαγών και να επαναφέρετε τον έλεγχο στον υπολογιστή-πελάτη. Σημειώστε ότι δεν θα εκτελεστεί Τ-SQL δηλώσεις που ακολουθούν τη δήλωση που προκάλεσε το σφάλμα.
      3. Εάν η ομαδοποίηση συνδέσεων που χρησιμοποιείται σε μια εφαρμογή που ανοίγει τη σύνδεση και να εκτελείται ένας μικρός αριθμός ερωτημάτων, πριν να απελευθερώσετε τη σύνδεση με το χώρο συγκέντρωσης, όπως μια εφαρμογή που βασίζεται στο Web, η προσωρινή απενεργοποίηση ομαδοποίηση συνδέσεων μπορεί να σας βοηθήσει να μετριάσει το πρόβλημα, μέχρι να τροποποιηθεί η εφαρμογή-πελάτης να χειρίζεται κατάλληλα τα σφάλματα. Απενεργοποιώντας ομαδοποίηση συνδέσεων, η αποδέσμευση της σύνδεσης θα προκαλέσει μια φυσική αποσύνδεσης της σύνδεσης SQL Server, με αποτέλεσμα ο διακομιστής επαναφορά οποιαδήποτε ανοιχτά συναλλαγές.
      4. Εάν είναι ενεργοποιημένη η ομαδοποίηση συνδέσεων και ο διακομιστής προορισμού είναι SQL Server 2000, η αναβάθμιση του υπολογιστή-πελάτη σε MDAC 2.6 ή νεότερη έκδοση μπορεί να αποβεί χρήσιμο. Αυτή η έκδοση των στοιχείων MDAC προσθέτει κώδικα για το πρόγραμμα οδήγησης ODBC και την υπηρεσία παροχής OLE DB, έτσι ώστε η σύνδεση θα είναι "Επαναφορά" πριν χρησιμοποιείται εκ νέου. Αυτή η κλήση σε sp_reset_connection ματαιώνει τυχόν συναλλαγές που προετοιμάζονται από το διακομιστή (συναλλαγών DTC ξεκίνησε από το πρόγραμμα-πελάτης app δεν επηρεάζονται), Επαναφέρει την προεπιλεγμένη βάση δεδομένων, ΟΡΊΣΤΕ τις επιλογές και ούτω καθεξής. Σημειώστε ότι η σύνδεση έχει επαναφερθεί δεν μέχρι να χρησιμοποιείται ξανά από το σύνολο της σύνδεσης, ώστε να είναι δυνατό ένας χρήστης θα μπορούσε να ανοίξει μια συναλλαγή και στη συνέχεια αφήστε τη σύνδεση με το χώρο σύνδεσης, αλλά δεν μπορεί να επαναχρησιμοποιείται για μερικά δευτερόλεπτα, κατά την οποία θα παραμείνει ανοικτή τη συναλλαγή. Εάν η σύνδεση δεν χρησιμοποιείται ξανά, όταν η σύνδεση λήγει και καταργείται από το χώρο συγκέντρωσης σύνδεση θα ματαιωθεί η συναλλαγή. Συνεπώς, είναι βέλτιστη για την εφαρμογή-πελάτη ματαίωση συναλλαγών με τους χειρισμού σφαλμάτων προγράμματος ή χρησιμοποιήστε ΟΡΙΣΜΌΣ XACT_ABORT ON για να αποφύγετε αυτήν την πιθανή καθυστέρηση.
    • Στην πραγματικότητα, αυτή η κλάση πρόβλημα αποκλεισμού ίσως επίσης ένα πρόβλημα απόδοσης και απαιτείται για την άσκηση αυτή καθεαυτή. Εάν ο χρόνος εκτέλεσης του ερωτήματος μπορεί να υποβαθμιστεί, θα παρουσιαστεί το χρονικό όριο ερωτήματος ή "Άκυρο". Είναι σημαντικό ότι η εφαρμογή είναι σε θέση να χειριστεί το χρονικό όριο ή ακύρωση σενάρια θα πρέπει αυτά προκύπτουν, αλλά μπορείτε επίσης μπορεί να επωφεληθούν από την εξέταση την απόδοση του ερωτήματος.
  3. Αποκλεισμός προκαλείται από ένα αναγνωριστικό SPID, του οποίου η αντίστοιχη εφαρμογή προγράμματος-πελάτη δεν λάβει όλες οι γραμμές αποτελέσματος ολοκλήρωσης

    Μετά την αποστολή ενός ερωτήματος στο διακομιστή, όλα applicationsmust fetch αμέσως όλες οι γραμμές αποτελέσματος για ολοκλήρωση. Εάν μια εφαρμογή doesnot λήψης όλων των γραμμών αποτέλεσμα, μπορεί να μείνει κλειδώματα σε πίνακες, ο αποκλεισμός otherusers. Εάν χρησιμοποιείτε μια εφαρμογή που υποβάλλει διαφανώς SQLstatements στο διακομιστή, η εφαρμογή πρέπει να fetch όλες οι γραμμές αποτελέσματος. Εάν itdoes δεν (και αν δεν μπορεί να ρυθμιστεί για να γίνει αυτό), ενδέχεται να είναι δυνατή η toresolve το πρόβλημα αποκλεισμού. Για να αποφύγετε το πρόβλημα, μπορείτε να restrictpoorly ελαττωματικό εφαρμογές σε μια αναφορά ή μια απόφαση-supportdatabase.

    Ανάλυση:

    Η εφαρμογή πρέπει να εγγραφεί ξανά λήψη όλων των γραμμών του αποτελέσματος για την ολοκλήρωση.
  4. Αποκλεισμός οφείλεται σε αδιέξοδη κατάσταση κατανεμημένου προγράμματος-πελάτη/διακομιστή

    Σε αντίθεση με ένα συμβατικό αδιέξοδο, μια κατανεμημένη deadlockis δεν ανιχνεύσιμες χρησιμοποιώντας το RDBMS κλείδωμα της διαχείρισης. Αυτό οφείλεται το thatonly γεγονός, ένας από τους πόρους που σχετίζονται με το αδιέξοδο είναι ένα κλείδωμα του SQL Server. Theother πλευρά του το αδιέξοδο είναι σε επίπεδο εφαρμογής προγράμματος-πελάτη, μέσω της οποίας SQLServer πρέπει να πάρετε. Ακολουθούν δύο παραδείγματα για το πώς αυτό μπορεί να συμβεί, και να αποφύγετε πιθανούς τρόπους εφαρμογής.

    1. Προγράμματος-πελάτη/διακομιστή κατανεμημένων αδιέξοδο με ένα νήμα μόνο πρόγραμμα-πελάτη
      Εάν ο υπολογιστής-πελάτης έχει πολλές ανοικτές συνδέσεις και ένα νήμα εκτέλεσης, ενδέχεται να παρουσιαστεί το ακόλουθο κατανεμημένων αδιέξοδο. Για συντομία, ο όρος "dbproc" χρησιμοποιείται εδώ αναφέρεται στη δομή σύνδεσης υπολογιστή-πελάτη.

       SPID1------blocked on lock------->SPID2  /\                         (waiting to write results           |                           back to client)  |                                 |  |                                 |                      Server side  | ================================|==================================  |     <-- single thread -->       |                      Client side  |                                 \/  dbproc1   <-------------------   dbproc2 (waiting to fetch             (effectively blocked on dbproc1, awaiting  next row)                     single thread of execution to run)								
      Στην περίπτωση που εμφανίζεται παραπάνω, ένα νήμα εφαρμογής μόνο πρόγραμμα-πελάτη έχει δύο ανοιχτές συνδέσεις. Ασύγχρονη υποβάλλει μια λειτουργία SQL στο dbproc1. Αυτό σημαίνει ότι δεν αναμένει στην κλήση επιστροφής πριν να συνεχίσετε. Η εφαρμογή στη συνέχεια υποβάλλει μια άλλη λειτουργία SQL στο dbproc2 και περιμένει τα αποτελέσματα για να ξεκινήσετε την επεξεργασία τα δεδομένα που επιστρέφονται. Όταν ξεκινά η δεδομένων θα επιστρέψουν στην (όποια dbproc απαντά πρώτα--υποθέσουμε ότι πρόκειται για dbproc1), επεξεργάζεται έως ότου ολοκληρωθεί όλα τα δεδομένα που επιστρέφονται από το dbproc. Λαμβάνει αποτελέσματα από dbproc1 μέχρι SPID1 λαμβάνει αποκλειστεί σε ένα κλείδωμα λόγω SPID2 (επειδή τα δύο ερωτήματα ασύγχρονη εκτέλεση στο διακομιστή). Σε αυτό το σημείο, ο dbproc1 θα περιμένει απεριόριστα για περισσότερα δεδομένα. SPID2 δεν αποκλείεται σε ένα κλείδωμα, αλλά προσπαθήσει να στείλει δεδομένα του υπολογιστή-πελάτη, dbproc2. Ωστόσο, dbproc2 αποτελεσματικά αποκλείεται από dbproc1 στο επίπεδο εφαρμογής όπως το μονό νήμα εκτέλεσης για την εφαρμογή βρίσκεται σε χρήση από dbproc1. Αυτό έχει ως αποτέλεσμα μια αδιέξοδη κατάσταση που SQL Server δεν είναι δυνατό να εντοπίσει ή να επιλύσετε επειδή μόνο ένας των εμπλεκομένων πόρων είναι ένας πόρος του SQL Server.
    2. Προγράμματος-πελάτη/διακομιστή κατανεμημένων αδιέξοδο με ένα νήμα ανά σύνδεση

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

      SPID1------blocked on lock-------->SPID2  /\                         (waiting on net write)        Server side  |                                 |  |                                 |  | INSERT                          |SELECT  | ================================|==================================  |     <-- thread per dbproc -->   |                      Client side  |                                 \/  dbproc1   <-----data row-------   dbproc2 (waiting on                     (blocked on dbproc1, waiting for it  insert)                         to read the row from its buffer)								
      Αυτή η υπόθεση είναι παρόμοια με παράδειγμα Α, εκτός από τις dbproc2 και SPID2 να εκτελούν μια εντολή SELECT, με σκοπό την εκτέλεση της γραμμής-σε-συγκεκριμένης επεξεργασίας και παράδοση κάθε γραμμή μέσω του buffer για να dbproc1 για μια εισαγωγή, ενημερωμένη ΈΚΔΟΣΗ, ή να ΔΙΑΓΡΆΨΕΤΕ δήλωση στον ίδιο πίνακα. Τελικά, SPID1 (εκτελώντας το INSERT, UPDATE ή DELETE) αποκλειστεί σε ένα κλείδωμα λόγω SPID2 (εκτελώντας την ΕΠΙΛΟΓΉ). SPID2 εγγράφει μια γραμμή αποτέλεσμα το dbproc2 του προγράμματος-πελάτη. Dbproc2 προσπαθεί, στη συνέχεια, για τη μεταβίβαση της γραμμής σε buffer dbproc1, αλλά θα βρει dbproc1 είναι απασχολημένος (παρεμποδίζεται αναμονή στο SPID1 για να ολοκληρωθεί η τρέχουσα INSERT, η οποία αποκλείεται από SPID2). Σε αυτό το σημείο, dbproc2 έχει αποκλειστεί στο επίπεδο εφαρμογής, από dbproc1 του οποίου SPID (SPID1) έχει αποκλειστεί σε επίπεδο βάσης δεδομένων από την SPID2. Και πάλι, αυτό καταλήγει σε αδιέξοδη κατάσταση που SQL Server δεν είναι δυνατό να εντοπίσει ή να επιλύσετε επειδή μόνο ένας των εμπλεκομένων πόρων είναι ένας πόρος του SQL Server.
    Δύο παραδείγματα Α και Β είναι Θεμελιώδη ζητήματα που thatapplication οι προγραμματιστές πρέπει να γνωρίζουν. Αυτά πρέπει να κώδικα κατάλληλα εφαρμογές σε περιπτώσεις handlethese.

    Λύσεις:

    Δύο αξιόπιστες λύσεις είναι να χρησιμοποιήσετε ένα querytimeout ή δεσμευμένα συνδέσεις.

    • Χρονικό όριο ερωτήματος
      Όταν ένα χρονικό όριο ερωτήματος έχει παρασχεθεί, εάν παρουσιαστεί το κατανεμημένο αδιέξοδο, θα διακοπεί όταν στη συνέχεια συμβαίνει χρονικού ορίου. Ανατρέξτε στην βιβλιοθήκης ΒΔ ή την τεκμηρίωση του ODBC για περισσότερες πληροφορίες σχετικά με τη χρήση ενός χρονικού ορίου ερωτήματος.
    • Δεσμευμένο συνδέσεις
      Αυτή η δυνατότητα επιτρέπει σε έναν υπολογιστή-πελάτη με πολλαπλές συνδέσεις για να συνδέσετε σε μια μοναδική συναλλαγή χώρο, ώστε να μην αποκλείσετε την μεταξύ τους τις συνδέσεις. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα "Χρήση συνδέσεων δεσμευμένο" στον SQL Server 7.0 Books Online.
  5. Αποκλεισμός προκαλείται από SPID που βρίσκεται σε ένα "χρυσό" ή επαναφορά, κατάσταση

    Ένα ερώτημα τροποποίησης δεδομένων που είναι KILLed ή canceledoutside από μια συναλλαγή που καθορίζεται από το χρήστη, θα γίνει επαναφορά. Να occuras ένα αποτέλεσμα η επανεκκίνηση του υπολογιστή πελάτη και του sessiondisconnecting δικτύου. Παρομοίως, ένα ερώτημα που έχει επιλεγεί ως το θύμα αδιέξοδη κατάσταση θα είναι rolledback. Ένα ερώτημα τροποποίησης δεδομένων συχνά δεν είναι δυνατό να γίνει επαναφορά κάθε ταχύτερα από όσο thechanges αρχικά εφαρμόστηκαν. Για παράδειγμα, εάν μια ΔΙΑΓΡΑΦΉ, εισαγωγή ή UPDATEstatement είχε εκτελεστεί για μία ώρα, αυτό μπορεί να διαρκέσει τουλάχιστον μία ώρα επαναφοράς. Αυτό είναι αναμενόμενη συμπεριφορά, επειδή οι αλλαγές που έγιναν πρέπει να είναι completelyrolled πίσω ή συναλλαγών και φυσική ακεραιότητα της βάσης δεδομένων θα becompromised. Επειδή αυτό πρέπει να συμβεί, SQL Server, επισημαίνει το SPID σε κατάσταση "χρυσό" ή επαναφοράς (που σημαίνει ότι δεν είναι δυνατό να θανατωθούν ή έχει επιλεγεί ως ένα deadlockvictim). Αυτό συχνά μπορούν να αναγνωριστούν από την παρατήρηση της εξόδου sp_who, που μπορεί να υποδεικνύει την εντολή ROLLBACK. Στη στήλη κατάσταση των sys.sysprocesses υποδεικνύει κατάσταση ΕΠΑΝΑΦΟΡΆΣ, η οποία θα εμφανίζονται επίσης στην έξοδο sp_who ή στο SQL Server Management Studio δραστηριότητα εποπτείας.
    Ανάλυση:

    Πρέπει να περιμένετε μέχρι το SPID για να ολοκληρωθεί η επαναφορά των thechanges που έχουν γίνει.

    Εάν ο διακομιστής είναι εκτός λειτουργίας στη μέση αυτής της λειτουργίας, η βάση δεδομένων θα είναι σε κατάσταση λειτουργίας αποκατάστασης κατά την επανεκκίνηση, και itwill είναι προσβάσιμα μέχρι την επεξεργασία όλων των ανοικτών συναλλαγών. Startuprecovery έχει ουσιαστικά το ίδιο χρονικό διάστημα ανά συναλλαγή ως timerecovery εκτέλεσης και είναι δυνατή η πρόσβαση στη βάση δεδομένων κατά τη διάρκεια αυτής της περιόδου. Έτσι, forcingthe διακομιστή προς τα κάτω, η επιδιόρθωση ενός SPID σε κατάσταση επαναφοράς θα συχνά becounterproductive.

    Για να αποφύγετε αυτήν την περίπτωση, μην εκτελέσετε largebatch INSERT, UPDATE, ή ΔΙΑΓΡΆΦΕΤΕ λειτουργίες κατά τις ώρες διαθεσιμότητας σε συστήματα OLTP.Εάν είναι δυνατό, να εκτελέσει λειτουργίες κατά τη διάρκεια περιόδων χαμηλής δραστηριότητας.
  6. Αποκλεισμός προκαλείται από μια ορφανή σύνδεσης

    Εάν γίνει επανεκκίνηση τις παγιδεύσεις εφαρμογή προγράμματος-πελάτη ή το clientworkstation, η περίοδος λειτουργίας του δικτύου στο διακομιστή ίσως δεν beimmediately που έχουν ακυρωθεί υπό ορισμένες συνθήκες. Από την άποψη του διακομιστή, theclient εξακολουθεί να εμφανίζεται να παρίστανται και τα κλειδώματα που αποκτήθηκε ίσως να υπάρχει ακόμα beretained. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
    137983 Τρόπος αντιμετώπισης προβλημάτων ορφανές συνδέσεις στον SQL Server

    Ανάλυση:

    Εάν η εφαρμογή-πελάτης έχει αποσυνδεθεί withoutappropriately εκκαθάριση των πόρων, μπορείτε να τερματίσετε το SPID από εντολή KILL usingthe. Η εντολή KILL παίρνει την τιμή SPID ως δεδομένα εισόδου. Για παράδειγμα, για τη θανάτωση SPID 9, απλώς εισαγάγετε την ακόλουθη εντολή:

    KILL 9						

    Σημείωση Η εντολή KILL ενδέχεται να διαρκέσει έως 30 δευτερόλεπτα για να ολοκληρωθεί, επειδή το χρονικό διάστημα που μεσολαβεί μεταξύ των ελέγχων για την εντολή KILL.

Εφαρμογή συμμετοχή σε προβλήματα αποκλεισμού

Μπορεί να υπάρχει τάση για να εστιάσετε σε θέματα ρύθμισης και πλατφόρμα διακομιστή όταν αντιμετωπίζουν πρόβλημα αποκλεισμού. Ωστόσο, αυτό δεν προκαλεί συνήθως σε ανάλυση και να απορροφά χρόνο και ενέργεια καλύτερα απευθύνονται σε εξέταση της εφαρμογής-πελάτη και τα ερωτήματα που υποβάλλει. Ανεξάρτητα από το επίπεδο ορατότητας της εφαρμογής εκθέτει όσον αφορά των κλήσεων βάσης δεδομένων που γίνεται κάποιο πρόβλημα εμποδίζει ωστόσο συχνά απαιτεί τόσο την επιθεώρηση των τις ακριβείς προτάσεις SQL που υποβλήθηκαν από την εφαρμογή και τη συμπεριφορά της εφαρμογής ακριβής σχετικά με την ακύρωση του ερωτήματος, διαχείριση της σύνδεσης, η λήψη όλων προκύπτουν γραμμές, και ούτω καθεξής. Εάν το εργαλείο ανάπτυξης δεν επιτρέπει το ρητό έλεγχο διαχείρισης σύνδεσης, Ακύρωση ερωτήματος, χρονικό όριο ερωτήματος, λήψη αποτελεσμάτων και ούτω καθεξής, αποκλεισμού προβλήματα ίσως δεν είναι δυνατό να επιλυθεί. Αυτή η δυνατότητα πρέπει να εξετάζονται προσεκτικά πριν να επιλέξετε ένα εργαλείο ανάπτυξης εφαρμογών για τον SQL Server, ιδιαίτερα για σημαντικά εταιρικά περιβάλλοντα OLTP.

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

Με την ορθή εφαρμογή και η σχεδίαση ερωτήματος, Microsoft SQL Server είναι μπορεί να υποστηρίξει πολλές χιλιάδες χρήστες ταυτόχρονα σε ένα μεμονωμένο διακομιστή, με λίγη αποκλεισμού.

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί με μηχανική μετάφραση

Ιδιότητες

Αναγνωριστικό άρθρου: 224453 - Τελευταία αναθεώρηση: 03/15/2015 04:22:00 - Αναθεώρηση: 3.0

Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2008 R2 Workgroup

  • kbsqlsetup kbhowto kbtshoot kbexpertiseinter kbinfo kbmt KB224453 KbMtel
Σχόλια
html> Asimov.clickstreamTracker.init();