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 tblStudentsBá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 tblStudentsA 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 > 0Megjelení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 blockedA 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 = 59A 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
GOAz é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 @lineMost, 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 51A 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.







