Weboldal keresés

Zárak keresése és eltávolítása a Microsoft SQL Serverben


Az MS SQL Server zárolása az egyik módja annak, hogy biztosítsák az adatok sértetlenségét, ha egyszerre több felhasználó is módosít. Az MSSQL zárolja az objektumokat a táblán, amikor egy tranzakció elindul, és feloldja a zárolást, amikor a tranzakció véget ér. Ebből a cikkből megtudjuk, hogyan találhat meg zárakat az MS SQL Server adatbázisban, és hogyan távolíthatja el őket.

Lehetőség van az egyik tábla zárolásának szimulálására egy befejezetlen tranzakcióval (olyan, amelyet nem hajtottak végre visszagörgetéssel vagy véglegesítéssel). Például használja a következő SQL lekérdezést:

USE tesdb1
BEGIN TRANSACTION
DELETE TOP(1) FROM tblStudents

Bármilyen változtatás előtt az SQL Server zárolja a táblát. Most próbálja meg megnyitni az SQL Server Management Studio programot, és végrehajtani egy egyszerű SQL-kiválasztó lekérdezést:

SELECT * FROM tblStudents

A lekérdezés lefagy a „Lekérdezés végrehajtása” állapotban, amíg le nem jár az időkorlát. Ennek az az oka, hogy a SELECT lekérdezés egy olyan tábla adataihoz próbál hozzáférni, amelyet az SQL Server zárolt.

A Microsoft SQL Serverben sorszintű vagy teljes táblázatszintű zárolásokat konfigurálhat.

Az MSSQL Server összes blokkolt lekérdezésének listájának megtekintéséhez futtassa a parancsot

select cmd,* from sys.sysprocesses
where blocked > 0

Megjelenítheti egy adott adatbázis zárolásainak listáját is:

SELECT * FROM master.dbo.sysprocesses
WHERE
dbid = DB_ID('testdb12') and blocked <> 0
order by blocked

A Blokkolt oszlop az erőforrásokat blokkoló folyamat folyamatazonosítóját mutatja. A lekérdezés várakozási idejét is mutatja (várakozási idő ezredmásodpercben). Igény esetén ezzel megkeresheti a legkorábbi vagy legújabb zárakat.

Egyes esetekben a zárolást egy teljes folyamatfa is okozhatja. A forrászárolási folyamat megkereséséhez használja a következő lekérdezést a SPID-re vonatkozóan, amíg meg nem találja a blocked=0 folyamatot, amely a zárolást hordozó kezdeti folyamat.

select * FROM
master.dbo.sysprocesses
where 1=1
--and blocked <> 0
and spid = 59

A folyamat SPID megadja az adott folyamat vagy tranzakció által végrehajtott utolsó SQL lekérdezés T-SQL kódját:

DBCC INPUTBUFFER(59)

A folyamat kényszerített leállításához és a zár feloldásához futtassa a következő parancsot:

KILL number_of_session
GO

Az én esetemben ez lesz:

KILL 59

Létrehozhat egy külön tárolt eljárást, ha folyamatosan zárolás történik, és szeretné azonosítani a leginkább erőforrásigényes lekérdezéseket:

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

Most, ha látni szeretné a táblát zároló SQL-lekérdezést, mindössze annyit kell tennie, hogy megadja a SPID-jét:

Exec GetCurrentQueryCode 51

A lekérdezési kódot a zárolási folyamat sql_handle részéből is megkaphatja. Például

select * from sys.dm_exec_sql_text (0x0100050069139B0650B35EA64702000000000000)

A Microsoft SQL Server Management Studio segítségével zárolásokat kereshet az MS SQL Serverben. Az alábbi módszerek egyikét használhatja:

  • Kattintson a jobb gombbal a kiszolgálóra, nyissa meg az Activity Monitor alkalmazást, és bontsa ki a Folyamatok elemet. Megjelenik azon kérelmek listája, amelyek az erőforrások felszabadítására várnak FÜGG. állapottal.

  • Válasszon ki egy adatbázist, és lépjen a Jelentések -> Minden blokkoló tranzakció menüpontra. Megjeleníti a zárolt lekérdezések listáját és a zárolási forrás SPID-jét is.

Kapcsolódó cikkek