Krav: Der er mange grunde til, at SQL Server-databaser forårsager deadlocks; i produktion kan alle støde på deadlock-problemer, og den specifikke årsag kan ikke nødvendigvis findes ud fra den unormale information om applikationsdeadlocks alene, så det er nødvendigt at bruge udvidelsesbegivenheder i SQL Server til at spore deadlock-problemer og registrere de specifikke detaljer om, hvornår deadlocks opstår.
Udvidet oversigt over arrangementet
Extended Events er en letvægts performanceovervågningsfunktion, der gør det muligt for brugere at indsamle de data, de har brug for til at overvåge og løse problemer. Denne funktion giver dig mulighed for at se detaljer om datamotorens interne drift til performanceovervågning og problemløsningsrelaterede formål.
Med Extended Events (XEvents)-arkitekturen kan brugere bruge så meget eller så lidt data, som de har brug for, til at overvåge, identificere eller fejlfinde ydeevnen af SQL Server, Azure SQL Database og Azure SQL Managed Instance. Udvidede events er meget konfigurerbare, lette og skalerbare godt.
Henvisning:
Hyperlink-login er synlig.
Hyperlink-login er synlig.
Årsager til fastlåste situationer
Deadlocks skyldes konkurrerende samtidighedslåse i en database, som regel i flertrinstransaktioner. Hver brugersession kan have en eller flere opgaver, der kører på sine vegne, hvor hver opgave kan hente eller vente på at hente forskellige ressourcer. Følgende typer ressourcer kan forårsage blokering og til sidst en deadlock.
- Låse: Låse, der venter på at hente ressourcer som objekter, sider, rækker, metadata og applikationer, kan forårsage deadlocks. For eksempel har transaktion T1 en delt lås (S-lås) på række r1 og venter på at få en eksklusiv lås (X-lås) for række r2. Transaktion T2 har en delt lås (S-lås) på række r2 og venter på at få en eksklusiv lås (X-lås) for række r1. Dette resulterer i en låse-løkke, hvor både T1 og T2 venter på, at hinanden frigiver den låste ressource.
- Arbejdstråde: Opgaver, der køer til tilgængelige arbejdstråde, kan forårsage deadlocks. Hvis en opgave i kø har en ressource, der blokerer alle arbejdertråde, vil det resultere i en deadlock. For eksempel, efter at session S1 starter en transaktion og erhverver en delt lås (S-lås) for linje r1, går den i dvale. En aktiv session, der kører på alle tilgængelige arbejdstråde, forsøger at opnå en eksklusiv lås (X-lås) for linje r1. Fordi session S1 ikke kan få fat i en worker-tråd, kan den ikke committe transaktionen og frigive låsen på linje r1. Dette vil resultere i en dødvande.
- Hukommelse: En deadlock kan opstå, når en samtidig anmodning venter på at få hukommelse, og den aktuelt tilgængelige hukommelse ikke er tilstrækkelig til dens behov. For eksempel udføres to samtidige forespørgsler (Q1 og Q2) som brugerdefinerede funktioner, hvor de modtager henholdsvis 10 MB og 20 MB hukommelse. Hvis hver forespørgsel kræver 30 MB, og den samlede tilgængelige hukommelse er 20 MB, skal Q1 og Q2 vente på hinanden for at frigøre hukommelse, hvilket vil resultere i en deadlock.
- Parallelle forespørgsler og eksekveringsrelaterede ressourcer: Behandlingskoordinatorer, generatorer eller forbrugertråde, der typisk er forbundet med switched porte, kan blokere hinanden, når de indeholder mindst én proces, der ikke er en del af en parallel forespørgsel, hvilket resulterer i deadlocks. Derudover bestemmer SQL Server, når en parallel forespørgsel starter kørsel, graden af parallelisme eller antallet af arbejdstråde baseret på den aktuelle arbejdsbyrde. En deadlock kan opstå, hvis der sker en uventet ændring i systemets arbejdsbyrde, for eksempel når en ny forespørgsel begynder at køre på serveren, eller når systemet løber tør for worker-tråde.
- Multiple Activity Outcome Set (MARS) ressourcer: Disse ressourcer bruges til at kontrollere krydsudførelsen af flere aktivitetsanmodninger under MARS.
Henvisning:
Hyperlink-login er synlig.
Deadlock udvidet hændelseslogning
Opret en udvidelsesbegivenhed for at registrere deadlock-informationen med følgende kommando:
Start en deadlock-begivenhed
Stop en eventsession
Slet en begivenhedssession
Forespørg hændelsessessionsdata
Testdødvande
Opret en ny Tab1-tabel til test, og skab to nye eksekveringsvinduer, og udfør henholdsvis følgende kommandoer:
En dødvande opstår som følger:
En transaktion (proces-ID 68) med en anden proces er fastlåst på en låst ressource og er blevet udvalgt som dødlås-offer. Gentag venligst transaktionen. Transaktionen (Proces-ID 68) var fastlåst på låseressourcer med en anden proces og er blevet valgt som deadlock-offer. Kør transaktionen igen.
Se data fra begivenhedssessionerne som vist i følgende figur:
De detaljerede XML-data er som følger:
(Slut)
|