Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Gælder for:✅ Warehouse i Microsoft Fabric
Hvis dine forespørgsler i Warehouse tager usædvanligt lang tid at køre eller virker fastlåste, er en mulig årsag låsning. Låsning opstår, når en session holder en lås, der forhindrer andre forespørgsler i at fortsætte.
Denne artikel viser dig, hvordan du kan afgøre, om låsning påvirker din arbejdsbyrde, og hvilke handlinger du kan tage.
Tip
Lageret bruger bord-niveau låsning. Enhver DML-operation får en lås på hele tabellen, uanset hvor mange rækker der er berørt. Denne adfærd adskiller sig fra SQL Server, som understøtter låse på række- og sideniveau.
Forudsætninger
- Et lager med aktive arbejdsbyrder.
- Medlemskab i Viewer-arbejdsområdets rolle er minimumstilladelsen til at forespørge de dynamiske administrationsvisninger (DMV'er) i denne artikel.
- For mere information om fejlfinding med DMV'er, se Overvåg forbindelser, sessioner og anmodninger ved brug af DMV'er.
Trin 1: Tjek om forespørgsler venter på låse
Start med at tjekke, om der er nogen forespørgsler, der venter på låsene.
Kør følgende forespørgsel:
SELECT
request_session_id,
resource_type,
resource_description,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE request_status = 'WAIT';
Hvis forespørgslen returnerer rækker, venter nogle sessioner på ressourcer, der holdes af andre sessioner. Hver række angiver en låsanmodning, der ikke kan imødekommes i øjeblikket.
Tip
Visningen sys.dm_tran_locks kan returnere et stort antal rækker som givne låse. Filtrering efter request_status = 'WAIT' fokuserer på de sessioner, der er blokeret.
Trin 2: Identificer blokerede forespørgsler
Tjek dernæst, hvilke forespørgsler der er blokeret, og hvilken session der blokerer dem.
SELECT
session_id,
status,
blocking_session_id,
wait_type,
total_elapsed_time,
open_transaction_count
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
Denne forespørgsel returnerer:
- Sessionen, der kører den blokerede forespørgsel (
session_id) - Sessionen blokerer det i øjeblikket (
blocking_session_id) - Hvor længe har den ventet (
total_elapsed_time, i millisekunder) - Om blokeringssessionen har en åben transaktion (
open_transaction_count)
Hvis en forespørgsel viser blocking_session_id er forskellig fra nul og open_transaction_count > 0, venter den på en anden session, der holder en lås.
Trin 3: Find blokeringssessionen
For at forstå, hvilken ressource der er låst, inspicer låse, som blokeringssessionen i øjeblikket holder. Udskift et session_id eksempelspørgsmål, som du nævnte tidligere, med følgende <blocking_session_id> eksempelforespørgsel:
SELECT
request_session_id,
resource_type,
resource_associated_entity_id,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE
request_status = 'GRANT'
AND request_session_id = <blocking_session_id>;
Brug denne forespørgsel til at bestemme:
- Hvilke ressourcer blokeringssessionen aktuelt holder låser på. For eksempel kan du bruge
sys.objectstil at identificere hvorresource_associated_entity_id.resource_type = OBJECT - Låsetilstanden (for eksempel Eksklusiv (
X), Schema-Modification (Sch-M)) - Uanset om låsen er relateret til en DDL-operation eller statistikopdatering (
UPDSTATS)
Bemærkning
Statistikrelaterede låse (såsom dem fra UPDSTATS) optræder også i sys.dm_tran_locks. Schema-Modification (Sch-M) og Eksklusive (X) låse er de mest almindelige blokeringer, men enhver låsetype kan blokere en konfliktfyldt anmodning (for eksempel Sch-S blokeringer Sch-M).
Trin 4: Find ejeren af blokeringstransaktionen
I mange tilfælde foretrækker du måske at spørge ejeren af blokeringstransaktionen COMMIT eller ROLLBACK deres arbejde i stedet for at afslutte sessionen. Overvej at bruge TRYCATCH strukturer til fejlhåndtering med COMMIT eller ROLLBACK. For mere information, se TRY... FANG.
Du kan identificere ejeren og forespørgslen tilknyttet blokeringssessionen. Udskift et session_id eksempelspørgsmål, som du nævnte tidligere, med følgende <blocking_session_id> eksempelforespørgsel:
SELECT
r.session_id,
s.login_name,
s.program_name,
r.status,
r.blocking_session_id,
r.command,
r.total_elapsed_time,
s.last_request_start_time,
s.last_request_end_time
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
WHERE r.session_id = <blocking_session_id>;
-
login_nameer ejeren af blokeringssessionen. -
program_nameer applikationen, der indledte sessionen. VærdienDMS_userangiver Fabric-portalforespørgselseditoren. -
commander kommandoen, der aktuelt kører.
Du kan derefter kontakte ejeren af transaktionen for at forpligte dig eller rulle den tilbage, hvis det er relevant.
Trin 5: Tjek om blokeringssessionen er inaktiv eller ikke fremskrider
En blokeringssession kan virke aktiv, men gør faktisk ikke fremskridt.
Indikatorer for en inaktiv eller fastlåst session inkluderer:
-
status = 'sleeping'indikerer ingen aktiv forespørgsel kørende. - Se efter en
last_request_start_timeperiode, der er væsentligt tidligere end nutid, hvilket indikerer en langvarig åben anmodning. - Se efter en
total_elapsed_timeder ikke stiger mellem tjek, hvilket indikerer en fastlåst session.
SELECT
session_id,
status,
last_request_start_time,
last_request_end_time,
open_transaction_count
FROM sys.dm_exec_sessions
WHERE session_id = <blocking_session_id>;
- Hvis sessionens status er
sleepingogopen_transaction_count > 0, har sessionen en åben transaktion uden aktiv forespørgsel – den holder en lås uden at udføre arbejde. - Hvis sessionen optræder i
sys.dm_exec_requestsogtotal_elapsed_timefortsætter med at stige mellem checks, skrider sessionen aktivt frem. Det kan være bedre at vente på, at transaktionen er fuldført, frem for at afslutte den og tvinge en rollback.
Trin 6: Tag handling for at løse blokeringen
Bemærkning
Blokeringssituationer løser sig ofte af sig selv, når blokeringssessionen har afsluttet sin transaktion. Hvis din arbejdsbyrde kan tåle forsinkelsen, er ventetid den sikreste løsning.
Hvis du har brug for at fjerne blokeringen af downstream-forespørgsler, så overvej, om en blokeringssession har følgende karakteristika:
- Har en åben transaktion
- Ser ud til at være inaktiv eller ikke i gang
- Holder du en blokeringslås (for eksempel Eksklusiv (
X) ellerSch-M)
Hvis ja, kan et medlem af Admin-arbejdsområdets rolle afslutte en session ved at bruge:
KILL <session_id>;
Kommandoen KILL vil:
- Afslut sessionen
- Rull alt arbejde udført i den aktive transaktion i den pågældende session tilbage
- Lås låsen op
- Lad downstream-forespørgsler fortsætte
Forsigtighed
At afslutte en session ruller alt uforpligtet arbejde udført af den session tilbage. Denne handling kan fortryde dataændringer foretaget af brugeren eller applikationen. Brug kun denne mulighed, når du er sikker på, at afsluttelsen af transaktionen ikke påvirker din arbejdsbyrde negativt.
Trin 7: Undgå fremtidige låseproblemer
For at hjælpe med at forhindre lignende problemer:
- Undgå at lade eksplicitte transaktioner stå åbne (
BEGIN TRANSACTIONuden en tilsvarendeCOMMITellerROLLBACK). - Bevar kortlivede transaktioner. Udfør kun de nødvendige operationer inden for transaktionen.
- Altid
COMMITellerROLLBACKtransaktioner, når de er fuldført. - Planlæg DDL-operationer (såsom
ALTER TABLE) under lavtrafikvinduer.
Overvåg proaktivt åbne transaktioner ved at bruge:
SELECT
session_id,
login_name,
open_transaction_count,
program_name,
status,
blocking_session_id,
last_request_start_time
FROM sys.dm_exec_sessions
WHERE open_transaction_count > 0;
Regelmæssig overvågning af åbne transaktioner og indgriben, når det er relevant, hjælper med at mindske sandsynligheden for, at blokeringskæder dannes.