Låser i MS SQL Server er en måte å sikre integriteten til data når endringer gjøres av flere brukere samtidig. MSSQL låser objekter på et bord når en transaksjon starter og frigjør låsen når transaksjonen avsluttes. I denne artikkelen vil vi lære hvordan du finner låser i MS SQL Server-databasen og fjerner dem.
Det er mulig å simulere en lås på et av bordene ved å bruke en uferdig transaksjon (en som ikke er fullført ved tilbakerulling eller commit). Bruk for eksempel følgende SQL-spørring:
USE tesdb1
BEGIN TRANSACTION
DELETE TOP(1) FROM tblStudents
Før noen endringer gjøres, vil SQL Server låse tabellen. Prøv nå å åpne SQL Server Management Studio og utføre en enkel SQL-valgspørring:
SELECT * FROM tblStudents
Spørringen vil fryse i tilstanden «Utfører spørring» til den ble tidsavbrutt. Dette er fordi SELECT-spørringen prøver å få tilgang til data i en tabell som er låst av SQL Server.

Du kan konfigurere låser på radnivå eller fullt tabellnivå i Microsoft SQL Server.
For å få en liste over alle blokkerte spørringer i MSSQL Server, kjør kommandoen
select cmd,* from sys.sysprocesses
where blocked > 0
Du kan også vise en liste over låser for en bestemt database:SELECT * FROM master.dbo.sysprocesses
WHERE
dbid = DB_ID('testdb12') and blocked <> 0
order by blocked
Kolonnen Blokkert viser prosess-ID-en til prosessen som blokkerte ressursene. Den viser også ventetiden for denne spørringen (ventetid i millisekunder). Om nødvendig kan denne brukes til å søke etter de tidligste eller nyeste låsene.


I noen tilfeller kan en lås være forårsaket av et helt prosesstre. For å finne kildelåsprosessen, bruk følgende spørring for SPID til du finner prosessen med blokkert=0, som er den første prosessen som holder låsen.
select * FROM
master.dbo.sysprocesses
where 1=1
--and blocked <> 0
and spid = 59
Prosess SPID gir deg T-SQL-koden til den siste SQL-spørringen som ble utført av den prosessen eller transaksjonen:
DBCC INPUTBUFFER(59)


For å tvinge drepe prosessen og frigjøre låsen, kjør kommandoen:
KILL number_of_session
GO
I mitt tilfelle vil det være:
KILL 59


Du kan opprette en egen lagret prosedyre hvis låser stadig oppstår og du vil identifisere de mest ressurskrevende spørringene:
CREATE PROCEDURE GetCurrentQueryCode
@SPID int
AS
DECLARE @sql_handle binary(20), @stmt_start int, @stmt_end int
SELECT @sql_handle = sql_handle, @stmt_start = stmt_start/2, @stmt_end = CASE WHEN stmt_end = -1 THEN -1 ELSE stmt_end/2 END
FROM master.dbo.sysprocesses
WHERE spid = @SPID AND ecid = 0
DECLARE @line nvarchar(4000)
SET @line = (SELECT SUBSTRING([text], COALESCE(NULLIF(@stmt_start, 0), 1),
CASE @stmt_end WHEN -1 THEN DATALENGTH([text]) ELSE (@stmt_end - @stmt_start) END) FROM ::fn_get_sql(@sql_handle))
print @line
Nå, hvis du vil se SQL-spørringen som låste tabellen, er alt du trenger å gjøre å spesifisere SPID:
Exec GetCurrentQueryCode 51
Se også:Slik installerer du SQL Server 2016 CTP 3.0 på Windows Server 2012 R2


Du kan også få spørringskoden fra sql_handle til låseprosessen. For eksempel
select * from sys.dm_exec_sql_text (0x0100050069139B0650B35EA64702000000000000)


Du kan bruke Microsoft SQL Server Management Studio til å søke etter låser i MS SQL Server. Du kan bruke en av følgende metoder:











