Krav: Det finns många anledningar till att SQL Server-databaser orsakar deadlocks, i produktion kan alla stöta på deadlock-problem, och den specifika orsaken kanske inte baseras enbart på den onormala informationen om applikationsdeadlocks, så det är nödvändigt att använda tilläggshändelser i SQL Server för att spåra deadlock-problem och registrera specifika detaljer om när deadlocks uppstår.
Utökad översikt av evenemanget
Extended Events är en lättviktig funktion för prestandaövervakning som låter användare samla in den data de behöver för att övervaka och lösa problem. Denna funktion gör det möjligt att se detaljer om datamotorns interna drift för prestandaövervakning och problemlösning.
Med Extended Events (XEvents)-arkitekturen kan användare använda så mycket eller så lite data som behövs för att övervaka, identifiera eller felsöka prestandan hos SQL Server, Azure SQL Database och Azure SQL Managed Instance. Utökade evenemang är mycket konfigurerbara, lättviktiga och skalbara väl.
Hänvisning:
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
Orsaker till dödlägen
Deadlocks orsakas av konkurrerande samtidighetslås i en databas, vanligtvis i flerstegstransaktioner. Varje användarsession kan ha en eller flera uppgifter som körs åt sig, där varje uppgift kan hämta eller vänta på att hämta olika resurser. Följande typer av resurser kan orsaka blockering och så småningom leda till deadlock.
- Lås: Lås som väntar på att hämta resurser som objekt, sidor, rader, metadata och applikationer kan orsaka dödläge. Till exempel har transaktion T1 ett delat lås (S-lås) på rad r1 och väntar på att få ett exklusivt lås (X-lås) för rad r2. Transaktion T2 har ett delat lås (S-lås) på rad r2 och väntar på att få ett exklusivt lås (X-lås) för rad r1. Detta resulterar i en låsslinga där både T1 och T2 väntar på att den låsta resursen ska släppas fri.
- Arbetstrådar: Uppgifter som köar för tillgängliga arbetstrådar kan orsaka deadlocks. Om en köad uppgift har en resurs som blockerar alla arbetstrådar kommer det att leda till ett deadlock. Till exempel, efter att session S1 startar en transaktion och skaffar ett delat lås (S-lås) för rad r1, går den i viloläge. En aktiv session som körs på alla tillgängliga arbetstrådar försöker få ett exklusivt lås (X-lås) för rad r1. Eftersom session S1 inte kan få en worker-tråd kan den inte committa transaktionen och släppa låset på rad r1. Detta leder till ett dödläge.
- Minne: En deadlock kan uppstå när en samtidig begäran väntar på att få minne och det tillgängliga minnet inte räcker till för dess behov. Till exempel körs två samtidiga frågor (Q1 och Q2) som användardefinierade funktioner, vilket erhåller 10 MB respektive 20 MB minne. Om varje fråga kräver 30 MB och det totala tillgängliga minnet är 20 MB, måste Q1 och Q2 vänta på varandra för att frigöra minnet, vilket leder till deadlock.
- Parallella frågor och exekveringsrelaterade resurser: Bearbetningskoordinatorer, generatorer eller konsumenttrådar som vanligtvis är kopplade till switchade portar kan blockera varandra när de innehåller minst en process som inte är en del av en parallell fråga, vilket resulterar i deadlocks. Dessutom, när en parallell fråga börjar köras, bestämmer SQL Server graden av parallellism eller antalet arbetstrådar baserat på den aktuella arbetsbelastningen. En deadlock kan uppstå om det sker en oväntad förändring i systemets arbetsbelastning, till exempel när en ny fråga börjar köras i servern eller när systemet får slut på arbetstrådar.
- Resurser för flera aktivitetsutfallsuppsättningar (MARS): Dessa resurser används för att kontrollera korsexekveringen av flera aktivitetsförfrågningar under MARS.
Hänvisning:
Inloggningen med hyperlänken är synlig.
Deadlock utökad händelseloggning
Skapa en förlängningshändelse för att registrera deadlock-informationen med följande kommando:
Starta en deadlock-händelsesession
Stoppa en eventsession
Ta bort en händelsesession
Sök i händelsesessionsdata
Testdödlägen
Skapa en ny Tab1-tabell för testning, skapa två nya exekveringsfönster och kör följande kommandon respektive:
En deadlock uppstår enligt följande:
En transaktion (process-ID 68) med en annan process är deadlock på en låst resurs och har valts som deadlock-offer. Var snäll och kör transaktionen igen. Transaktionen (Process ID 68) var låst på låsresurser med en annan process och har valts som dödlåsningsoffer. Kör om transaktionen.
Visa data från händelsesessionerna som visas i följande figur:
Den detaljerade XML-datan är som följer:
(Slut)
|